PDBデバッグPython入門

5007 ワード

他人のコードを変更せざるを得ない状況に陥ったことは何回ありますか?もしあなたが開発チームの一員であれば、上記の状況に遭遇した回数はあなたが望んでいるよりも多いです.しかし、Pythonには、他の多くの言語のようにきれいなデバッグ機能があり、この場合に便利です.本文は高速チュートリアルで、あなたのコード生活をもっと簡単にすることを望んでいます.
1.混乱したプログラム
このチュートリアルの目的で、次の簡単なプログラムを検討してみましょう.
このプログラムは2つのコマンドラインパラメータを受信し、加算と減算を実行します.
(ユーザが有効な値を入力したと仮定し、コードにエラー処理は行われていません.)
import sys

def add(num1=0, num2=0):
    return int(num1) + int(num2)

def sub(num1=0, num2=0):
    return int(num1) - int(num2)

def main():
    #Assuming our inputs are valid numbers
    print sys.argv
    addition = add(sys.argv[1], sys.argv[2])
    print addition
    subtraction = sub(sys.argv[1], sys.argv[2])
    print subtraction

if __name__ == '__main__':
    main()

2. PDB
Pythonは、実際にはインタラクティブなソースデバッガである有用なモジュールPDBを提供しています.
このモジュールを使用するには、次の2行のコードが必要です.
import pdb

pdb.set_trace()

私たちが修正したプログラムを見てください.中にはいくつかのブレークポイントが含まれています.
import pdb
import sys
def add(num1=0, num2=0):
    return int(num1) + int(num2)
def sub(num1=0, num2=0):
    return int(num1) - int(num2)
def main():
    #Assuming our inputs are valid numbers
    print sys.argv
    pdb.set_trace() # 

3.プログラム実行トリガデバッガ
ブレークポイントを設定すると、通常のようにプログラムを実行できます.
python debugger.py 1 2

プログラムは、最初のブレークポイントで実行を停止します.
['debugger.py']
> /Users/someuser/debugger.py(15)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb)

14行目にブレークポイントを設定したので、実行する次の行が15行目であることがわかります.15行目まで実行する前にプログラムが停止していることがわかります.
ここにはいくつかのオプションがあります.次の手順でデバッグコマンドを見てみましょう.
4.次の行->n
デバッガプロンプトで、nを入力して次の行に実行します.
> /Users/someuser/debugger.py(14)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb) n
> /Users/someuser/debugger.py(15)main()
-> print addition

これにより、現在の行コードが実行され、次の行が実行される準備ができます.
nを使用してプログラム全体を行ごとに実行することができますが、これは実際には何の役にも立たない.
PDBは実際に私たちのadd関数に入っていないことを見たかもしれません.次に、デバッグをより面白くする他のいくつかのオプションを見てみましょう.
注意:よりクールな特性は、戻るキーをクリックして以前のコマンドを実行することです(この例では、コマンドnのみ).
5.印刷->p
次に、デバッグプログラムを再開します.(cをクリックしてPDBを末尾にジャンプするか、次のブレークポイントまでジャンプすることができます.プログラムには他のブレークポイントがないので、すべてのプログラムが実行されます.)
['debugger.py', '1', '2']
> /Users/someuser/debugger.py(14)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb)

今、sysを知りたいならArgvには次の内容が含まれています.
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb) p sys.argv
['debugger.py', '1', '2']
(Pdb) p sys.argv[1]
'1'
(Pdb)

この方法を使用すると、変数に実際にどのような値が格納されているかを簡単に見ることができます.
加算関数の内部に入ります.
6.ワンステップ->s
「s」を使用して加算関数の内部に入ることができます.
(Pdb) s
--Call--
> /Users/someuser/debugger.py(4)add()
-> def add(num1=0, num2=0):
(Pdb) n
> /Users/someuser/debugger.py(5)add()
-> return int(num1) + int(num2)
(Pdb)

これは加算関数の内部に持ち込み、n、p、その他の操作命令を加算関数の内部で使用することができます.
「r」をクリックすると、関数に入る前の戻り文に連れて行きます.
関数の最後にすばやくジャンプしたい場合は、このコマンドが役立ちます.
7.ブレークポイントの動的追加->b
前に、プログラムが実行される前にpdbを使用します.set_trace()にはブレークポイントが設定されています.
ただし、デバッグセッションが開始された後、プログラム内の特定の場所にブレークポイントを追加したい場合がよくあります.
ここでは、オプション「b」を用いて、この目的を達成することができる.
プログラムの実行を再開します.
['debugger.py', '1', '2']
> /Users/someuser/debugger.py(15)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb)

18行目にブレークポイントを設定します.
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb) b 18
Breakpoint 1 at /Users/someuser/debugger.py:18
(Pdb) c
We are in add--
3
> /Users/someuser/debugger.py(18)main()
-> print subtraction
(Pdb) p subtraction
-1
(Pdb)

上からPDBが18行目にジャンプし、次の命令を待っていることがわかります.
また、PDBは、このブレークポイントに1つの番号(本例では1)を割り当てている.以降の実行のために、ブレークポイント番号をオンまたはオフにすることで、対応するブレークポイントを有効または無効にできます.
8.リスト->l
デバッグ中にコードのどこにいるか忘れてしまうことがあります.この場合、「l」を使用すると、コード内の現在の位置を示す友好的なまとめが印刷されます.
['debugger.py', '1', '2']
> /Users/someuser/debugger.py(15)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb) l
 10
 11     def main():
 12         #Assuming our inputs are valid numbers
 13         print sys.argv
 14         pdb.set_trace() #      addition = add(sys.argv[1], sys.argv[2])
 16         print addition
 17         subtraction = sub(sys.argv[1], sys.argv[2])
 18         print subtraction

9.動的分配変数
デバッグセッションの間、変数を割り当ててデバッグを支援することができます.これはあなたにとっても役立ちます.例:
['debugger.py', '1', '2']
> /Users/someuser/debugger.py(15)main()
-> addition = add(sys.argv[1], sys.argv[2])
(Pdb) n
We are in add--
> /Users/someuser/debugger.py(16)main()
-> print addition
(Pdb) p addition
3 # /Users/someuser/debugger.py(17)main()
-> subtraction = sub(sys.argv[1], sys.argv[2])

n(すなわちPDB命令)のような変数を設定したい場合は、この命令を使用します.
(Pdb) !n=5
(Pdb) p n
5

10.終了->q
最後に、コードのどこでもデバッグを終了したい場合は、「q」を使用すると、実行中のプログラムが終了します.