サーチ…


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)


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow