Pythonはpdbでデバッグ

7637 ワード

転入先:JefferyZhとIBM
コマンドラインでパラメータを使用してデバッグ
うんてん
運転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)