Pythonはpdbでデバッグ
7637 ワード
転入先:JefferyZhとIBM
コマンドラインでパラメータを使用してデバッグ
うんてん
運転
いくつかの重要なコマンドブレークポイント設定 運転 を表示印刷変数
コマンドセット
コマンド#コマンド#
説明する
breakまたはb
ブレークポイントの設定
continueまたはc
プログラムの実行を続行
リストまたはl
現在の行のコード・セグメントの表示
Stepまたはs
アクセス関数
returnまたはr
現在の関数から戻るまでコードを実行
exitまたはq
中止して終了
nextまたはn
次の行の実行
pp
変数の値を印刷
help
ヘルプ
はい.pyにpdbモジュールをロードする
pdbはpythonが持参したパッケージであり、pythonプログラムにインタラクティブなソースコードデバッグ機能を提供しています.主な特性は、ブレークポイントの設定、単一ステップデバッグ、関数デバッグへのアクセス、現在のコードの表示、スタックフラグメントの表示、変数の値の動的変更などです.pdbは、表1を参照して、一般的なデバッグコマンドをいくつか提供します.
表1.pdb共通コマンド
コマンド#コマンド#
説明する
breakまたはbブレークポイントの設定
ブレークポイントの設定
continueまたはc
プログラムの実行を続行
リストまたはl
現在の行のコード・セグメントの表示
Stepまたはs
アクセス関数
returnまたはr
現在の関数から戻るまでコードを実行
exitまたはq
中止して終了
nextまたはn
次の行の実行
pp
変数の値を印刷
help
ヘルプ
次に、pdbを使用してデバッグする方法について、具体的な例について説明します.
リスト1.テストコードの例
デバッグの開始:スクリプトを直接実行し、pdbにとどまる.set_trace()でn+enterを選択して現在のstatementを実行します.n+enterを初めて押した後、enterの表示で前のdebugコマンドを繰り返し実行できます.
リスト2.pdbデバッグの利用
Debugの終了:quitまたはqを使用して現在のdebugを終了できますが、quitは非常に乱暴な方法でプログラムを終了し、その結果、直接crashになります.
リスト3.デバッグを終了
変数の値の印刷:デバッグ中に変数の値を印刷する必要がある場合は、pを直接使用して変数名を付けることができますが、印刷は現在のstatementが実行されている場合にのみ具体的な値が表示されます.そうしないと、NameError: エラー.
リスト4.debug中に変数を印刷する
cを使用して、現在のdebugを停止してプログラムを続行します.次のプログラムでset_が続くとstatement()の申明では、再びdebugの状態に入り、読者はコードprint finalの前にset_を加えることができます.trace()検証.
リスト5.デバッグを停止してプログラムを続行
表示コード:debugのときに現在のコードブロックを覚えるとは限らないが、具体的なコードブロックを表示するにはlistまたはlコマンドを使用して表示することができる.listは矢印->現在のdebugを指す文を使用します.
リスト6.debug中にコードを表示
関数を使用した場合のdebug
リスト7.関数の使用例
nを直接使用してdebugを行うとfinal=combine(a,b)という文になると通常の付与文として処理されprint finalに入る.関数をdebugするにはどうすればいいですか?sを直接使用して関数ブロックに入ることができます.関数の単一ステップデバッグは、上記の説明と似ています.関数内で単一ステップでデバッグしたくない場合は、ブレークポイントでrを直接押して呼び出した場所に終了します.
リスト8.関数のデバッグ
デバッグ時に値を動的に変更します.デバッグ時に変数の値を動的に変更できます.具体的には、次の例です.注意しなければならないのは、bが割り当てられているため、bの割り当てを変更したい場合は、使用するべきだというエラーです.B.
リスト9.デバッグ時に値を動的に変更
コマンドラインでパラメータを使用してデバッグ
うんてん
運転
python -m pdb test.py
(Pdb) , ,
(Pdb) h
いくつかの重要なコマンド
(Pdb)b 10 # py 10
(Pdb)b ots.py:20 # ots.py 20
(Pdb)b #
(Pdb)cl 2 # 2
(Pdb)n #
(Pdb)s # ,
(Pdb)c #
(Pdb)p param #
(Pdb)l #
(Pdb)a #
(Pdb)p param # , , (Pdb)p dir(param) (Pdb)p param.xxx
コマンドセット
コマンド#コマンド#
説明する
breakまたはb
ブレークポイントの設定
continueまたはc
プログラムの実行を続行
リストまたはl
現在の行のコード・セグメントの表示
Stepまたはs
アクセス関数
returnまたはr
現在の関数から戻るまでコードを実行
exitまたはq
中止して終了
nextまたはn
次の行の実行
pp
変数の値を印刷
help
ヘルプ
はい.pyにpdbモジュールをロードする
pdbはpythonが持参したパッケージであり、pythonプログラムにインタラクティブなソースコードデバッグ機能を提供しています.主な特性は、ブレークポイントの設定、単一ステップデバッグ、関数デバッグへのアクセス、現在のコードの表示、スタックフラグメントの表示、変数の値の動的変更などです.pdbは、表1を参照して、一般的なデバッグコマンドをいくつか提供します.
表1.pdb共通コマンド
コマンド#コマンド#
説明する
breakまたはbブレークポイントの設定
ブレークポイントの設定
continueまたはc
プログラムの実行を続行
リストまたはl
現在の行のコード・セグメントの表示
Stepまたはs
アクセス関数
returnまたはr
現在の関数から戻るまでコードを実行
exitまたはq
中止して終了
nextまたはn
次の行の実行
pp
変数の値を印刷
help
ヘルプ
次に、pdbを使用してデバッグする方法について、具体的な例について説明します.
リスト1.テストコードの例
1 import pdb
2 a = "aaa"
3 pdb.set_trace()
4 b = "bbb"
5 c = "ccc"
6 final = a + b + c
7 print final
デバッグの開始:スクリプトを直接実行し、pdbにとどまる.set_trace()でn+enterを選択して現在のstatementを実行します.n+enterを初めて押した後、enterの表示で前のdebugコマンドを繰り返し実行できます.
リスト2.pdbデバッグの利用
1 [root@rcc-pok-idg-2255 ~]# python epdb1.py
2 > /root/epdb1.py(4)?()
3 -> b = "bbb"
4 (Pdb) n
5 > /root/epdb1.py(5)?()
6 -> c = "ccc"
7 (Pdb)
8 > /root/epdb1.py(6)?()
9 -> final = a + b + c
10 (Pdb) list
11 1 import pdb
12 2 a = "aaa"
13 3 pdb.set_trace()
14 4 b = "bbb"
15 5 c = "ccc"
16 6 -> final = a + b + c
17 7 print final
18 [EOF]
19 (Pdb)
20 [EOF]
21 (Pdb) n
22 > /root/epdb1.py(7)?()
23 -> print final
24 (Pdb)
Debugの終了:quitまたはqを使用して現在のdebugを終了できますが、quitは非常に乱暴な方法でプログラムを終了し、その結果、直接crashになります.
リスト3.デバッグを終了
1 [root@rcc-pok-idg-2255 ~]# python epdb1.py
2 > /root/epdb1.py(4)?()
3 -> b = "bbb"
4 (Pdb) n
5 > /root/epdb1.py(5)?()
6 -> c = "ccc"
7 (Pdb) q
8 Traceback (most recent call last):
9 File "epdb1.py", line 5, in ?
10 c = "ccc"
11 File "epdb1.py", line 5, in ?
12 c = "ccc"
13 File "/usr/lib64/python2.4/bdb.py", line 48, in trace_dispatch
14 return self.dispatch_line(frame)
15 File "/usr/lib64/python2.4/bdb.py", line 67, in dispatch_line
16 if self.quitting: raise BdbQuit
17 bdb.BdbQuit
変数の値の印刷:デバッグ中に変数の値を印刷する必要がある場合は、pを直接使用して変数名を付けることができますが、印刷は現在のstatementが実行されている場合にのみ具体的な値が表示されます.そうしないと、NameError:
リスト4.debug中に変数を印刷する
1 [root@rcc-pok-idg-2255 ~]# python epdb1.py
2 > /root/epdb1.py(4)?()
3 -> b = "bbb"
4 (Pdb) n
5 > /root/epdb1.py(5)?()
6 -> c = "ccc"
7 (Pdb) p b
8 'bbb'
9 (Pdb)
10 'bbb'
11 (Pdb) n
12 > /root/epdb1.py(6)?()
13 -> final = a + b + c
14 (Pdb) p c
15 'ccc'
16 (Pdb) p final
17 *** NameError:
18 (Pdb) n
19 > /root/epdb1.py(7)?()
20 -> print final
21 (Pdb) p final
22 'aaabbbccc'
23 (Pdb)
cを使用して、現在のdebugを停止してプログラムを続行します.次のプログラムでset_が続くとstatement()の申明では、再びdebugの状態に入り、読者はコードprint finalの前にset_を加えることができます.trace()検証.
リスト5.デバッグを停止してプログラムを続行
1 [root@rcc-pok-idg-2255 ~]# python epdb1.py
2 > /root/epdb1.py(4)?()
3 -> b = "bbb"
4 (Pdb) n
5 > /root/epdb1.py(5)?()
6 -> c = "ccc"
7 (Pdb) c
8 aaabbbccc
表示コード:debugのときに現在のコードブロックを覚えるとは限らないが、具体的なコードブロックを表示するにはlistまたはlコマンドを使用して表示することができる.listは矢印->現在のdebugを指す文を使用します.
リスト6.debug中にコードを表示
1 [root@rcc-pok-idg-2255 ~]# python epdb1.py
2 > /root/epdb1.py(4)?()
3 -> b = "bbb"
4 (Pdb) list
5 1 import pdb
6 2 a = "aaa"
7 3 pdb.set_trace()
8 4 -> b = "bbb"
9 5 c = "ccc"
10 6 final = a + b + c
11 7 pdb.set_trace()
12 8 print final
13 [EOF]
14 (Pdb) c
15 > /root/epdb1.py(8)?()
16 -> print final
17 (Pdb) list
18 3 pdb.set_trace()
19 4 b = "bbb"
20 5 c = "ccc"
21 6 final = a + b + c
22 7 pdb.set_trace()
23 8 -> print final
24 [EOF]
25 (Pdb)
関数を使用した場合のdebug
リスト7.関数の使用例
1 import pdb
2 def combine(s1,s2): # define subroutine combine, which...
3 s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, ...
4 s3 = '"' + s3 +'"' # encloses it in double quotes,...
5 return s3 # and returns it.
6 a = "aaa"
7 pdb.set_trace()
8 b = "bbb"
9 c = "ccc"
10 final = combine(a,b)
11 print final
nを直接使用してdebugを行うとfinal=combine(a,b)という文になると通常の付与文として処理されprint finalに入る.関数をdebugするにはどうすればいいですか?sを直接使用して関数ブロックに入ることができます.関数の単一ステップデバッグは、上記の説明と似ています.関数内で単一ステップでデバッグしたくない場合は、ブレークポイントでrを直接押して呼び出した場所に終了します.
リスト8.関数のデバッグ
1 [root@rcc-pok-idg-2255 ~]# python epdb2.py
2 > /root/epdb2.py(10)?()
3 -> b = "bbb"
4 (Pdb) n
5 > /root/epdb2.py(11)?()
6 -> c = "ccc"
7 (Pdb) n
8 > /root/epdb2.py(12)?()
9 -> final = combine(a,b)
10 (Pdb) s
11 --Call--
12 > /root/epdb2.py(3)combine()
13 -> def combine(s1,s2): # define subroutine combine, which...
14 (Pdb) n
15 > /root/epdb2.py(4)combine()
16 -> s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, ...
17 (Pdb) list
18 1 import pdb
19 2
20 3 def combine(s1,s2): # define subroutine combine, which...
21 4 -> s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, ...
22 5 s3 = '"' + s3 +'"' # encloses it in double quotes,...
23 6 return s3 # and returns it.
24 7
25 8 a = "aaa"
26 9 pdb.set_trace()
27 10 b = "bbb"
28 11 c = "ccc"
29 (Pdb) n
30 > /root/epdb2.py(5)combine()
31 -> s3 = '"' + s3 +'"' # encloses it in double quotes,...
32 (Pdb) n
33 > /root/epdb2.py(6)combine()
34 -> return s3 # and returns it.
35 (Pdb) n
36 --Return--
37 > /root/epdb2.py(6)combine()->'"aaabbbaaa"'
38 -> return s3 # and returns it.
39 (Pdb) n
40 > /root/epdb2.py(13)?()
41 -> print final
42 (Pdb)
デバッグ時に値を動的に変更します.デバッグ時に変数の値を動的に変更できます.具体的には、次の例です.注意しなければならないのは、bが割り当てられているため、bの割り当てを変更したい場合は、使用するべきだというエラーです.B.
リスト9.デバッグ時に値を動的に変更
1 [root@rcc-pok-idg-2255 ~]# python epdb2.py
2 > /root/epdb2.py(10)?()
3 -> b = "bbb"
4 (Pdb) var = "1234"
5 (Pdb) b = "avfe"
6 *** The specified object '= "avfe"' is not a function
7 or was not found along sys.path.
8 (Pdb) !b="afdfd"
9 (Pdb)