2013-09-30 18 views
19

私はPythonコードのどこかにipdb.set_trace()を使用しました。 IPDBコマンドを使用してこのブレークポイントを無視することはできますか?ipdb.set_trace()で設定したブレークポイントを削除することはできますか?

clearは、すべてのブレークポイントをクリアしたことを伝えますが、ipdb.set_trace()の行を見つけたときにIPDBが再び停止します。

disable 1が私に語った:No breakpoint numbered 1 ignore 1言う:Breakpoint index '1' is not valid

明確にする:もちろん私は単に私のソースコードからブレークポイントを削除することができます。しかし、これはデバッガを終了し、再度起動する必要があります。しばしば、どこかに手を入れてデバッガを再起動すると、人生が難しくなります。また、巨大なループがあり、オブジェクトをループ内で検査したい場合は、オブジェクトの直後にループ内にブレークポイントを配置するのが最も簡単です。どうすればループをスキップして(そして何千もの呼び出しをset_trace())、ループの後にコードをステップしてnextを使用することができますか?

+1

ブレークポイントはデバッグのためのものです。設定した場所を追跡することをお勧めします。あなたは 'grep'やそれがどこであるかを知るための検索をする方が良いです。 – karthikr

+0

@karthikrはい、もちろんです。私はあなたが私の質問を誤解していると思います。私はどのようにデバッガを使用したいのかを明確にしようとしました。 – lumbric

答えて

-2

プログラムを実行すると、ヒットしたときのどこにidb.set_trace()が設定されているかがわかります(そうでない場合はwhereまたはbtコマンドを試してください)。その行をファイルから削除し、プログラムを再起動することができます。

これ以外の場合は、実験的に感じる場合はthisが便利です。

31

さて、あなたはPythonの何かがオブジェクトであるという事実を利用することができます。

def f(): pass 
ipdb.set_trace = f 

set_traceがまだ呼び出されますが、それは何もしません。デバッガでいる間、あなたはこのような何かを行うことができます。もちろん は、それが多少永続的ですが、あなただけ

reload ipdb 

を行うことができますし、あなたが戻って元の動作を取得します。

(通常はtry/exceptの下で呼び出されることが多い、頻繁に呼び出される関数にブレークポイントを誤って配置した場合、なぜこのようになりますか?この機能で1000回停止していることがわかったら、ctrl -c、それはあなたが低レベルのコードにしているのであれば、あなたのset_tracesは、いくつかのコンテキストを持っていることを確認してくださいするtry/exceptでキャッチし、あなたが再びipdbにしています:。

など
if myvar in ['some', 'sentinel', 'values']: 
    ipdb.set_trace() 

+1

+1は単に 'set_trace()'を上書きするという素晴らしい提案です。とにかく、特定のブレークポイントを削除することはできません。 – lumbric

+2

この概念を拡張して、inspectモジュールを使用して現在のファイル/行を判別し、戻す(何もしない)か、元のipdb.set_trace()を呼び出すだけで、単一のブレークポイントを削除することができます。私はレシピは持っていませんが、これを数回使用していますので、これは私に1つを組み込むよう促しています... –

+4

テストスイートを使って作業するとき、これは私にはかなり起こります。あなたが立ち往生していてシェルプロンプトを元に戻したいのであれば、単純な 'del ipdb.set_trace'は魅力のように働きます。 –

9

Corleyから学んだ後

ipdb.set_trace = lambda: None 

私のために働く。