Python Language
デバッグ
サーチ…
Pythonデバッガ:_pdb_を使用したステップスルーデバッグ
Python標準ライブラリには、 pdbというインタラクティブなデバッグライブラリが含まれています。 pdbには広範な機能があります。最も一般的に使用されるのは、プログラムを「ステップスルー」する機能です。
ステップスルーデバッグをすぐに使用するには:
python -m pdb <my_file.py>
これにより、プログラムの最初の行でデバッガが起動します。
通常、デバッグのためにコードの特定のセクションを対象にしたいと思うでしょう。これを行うには、pdbライブラリをインポートし、 set_trace()を使用してこの問題のあるサンプルコードのフローを中断します。
import pdb
def divide(a, b):
pdb.set_trace()
return a/b
# What's wrong with this? Hint: 2 != 3
print divide(1, 2)
このプログラムを実行すると、インタラクティブなデバッガが起動します。
python foo.py
> ~/scratch/foo.py(5)divide()
-> return a/b
(Pdb)
多くの場合、このコマンドは1行で使用されるので、1つの#文字でコメントアウトすることができます
import pdf; pdb.set_trace()
(Pdb)プロンプトで、プロンプトを入力することができます。これらのコマンドは、デバッガコマンドまたはPythonにすることができます。変数を出力するには、デバッガからpを使うか、pythonのprintを使うことができます。
(Pdb) p a
1
(Pdb) print a
1
すべてのローカル変数のリストを表示するには
locals
組み込み関数
これらは、デバッガの次の優れたコマンドを知っています:
b <n> | <f>: set breakpoint at line *n* or function named *f*.
# b 3
# b divide
b: show all breakpoints.
c: continue until the next breakpoint.
s: step through this line (will enter a function).
n: step over this line (jumps over a function).
r: continue until the current function returns.
l: list a window of code around this line.
p <var>: print variable named *var*.
# p x
q: quit debugger.
bt: print the traceback of the current execution call stack
up: move your scope up the function call stack to the caller of the current function
down: Move your scope back down the function call stack one level
step: Run the program until the next line of execution in the program, then return control back to the debugger
next: run the program until the next line of execution in the current function, then return control back to the debugger
return: run the program until the current function returns, then return control back to the debugger
continue: continue running the program until the next breakpoint (or set_trace si called again)
デバッガはPythonをインタラクティブに評価することもできます:
-> return a/b
(Pdb) p a+b
3
(Pdb) [ str(m) for m in [a,b]]
['1', '2']
(Pdb) [ d for d in xrange(5)]
[0, 1, 2, 3, 4]
注意:
変数名のどれかがデバッガコマンドと一致する場合は、感嘆符 ' !変数の前に変数を明示的に参照し、デバッガコマンドを参照することはできません。たとえば、カウンタに変数名「 c 」を使用すると、デバッガでその変数名を表示することがよくあります。単純な ' c 'コマンドは次のブレークポイントまで実行を継続します。代わりに ' !c 'を使用して、変数の値を次のように出力します。
(Pdb) !c
4
IPythonとipdb経由で
IPython (またはJupyter )がインストールされている場合、 次のコマンドを使用してデバッガを呼び出すことができます。
import ipdb
ipdb.set_trace()
到達すると、コードは終了して印刷されます:
/home/usr/ook.py(3)<module>()
1 import ipdb
2 ipdb.set_trace()
----> 3 print("Hello world!")
ipdb>
明らかに、これはコードを編集する必要があることを意味します。もっと簡単な方法があります:
from IPython.core import ultratb
sys.excepthook = ultratb.FormattedTB(mode='Verbose',
color_scheme='Linux',
call_pdb=1)
キャッチされていない例外が発生した場合、デバッガが呼び出されます。
リモートデバッガ
いくつかの場合、別のプロセスによって実行されるpythonコードをデバッグする必要があります。この場合、 rpdb
は便利です。
rpdbは、stdinとstdoutをソケットハンドラに再ルーティングするpdbのラッパーです。デフォルトでは、ポート4444でデバッガを開きます
使用法:
# In the Python file you want to debug.
import rpdb
rpdb.set_trace()
そして、このプロセスに接続するにはターミナルでこれを実行する必要があります。
# Call in a terminal to see the output
$ nc 127.0.0.1 4444
そして、あなたはpdb promtを得るでしょう
> /home/usr/ook.py(3)<module>()
-> print("Hello world!")
(Pdb)