Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonデバッガー(pdb)


ソフトウェア開発の専門用語では、「デバッグ」という用語は、プログラム内のエラーを見つけて修正するプロセスに広く使用されています。 Pythonの標準ライブラリには、Pythonプログラムをデバッグするためのユーティリティのセットであるpdbモジュールが含まれています。

デバッグ機能はPdbクラスで定義されています。このモジュールは、内部でbdbモジュールとcmdモジュールを使用します。

pdbモジュールには、非常に便利なコマンドラインインターフェイスがあります。これは、Pythonスクリプトの実行時に–m switch

を使用してインポートされます。
python –m pdb script.py

デバッガーの動作について詳しく知るために、最初にPythonモジュール(fact.py)を次のように記述します-

def fact(x):
   f = 1
   for i in range(1,x+1):
      print (i)
      f = f * i
   return f
if __name__=="__main__":
   print ("factorial of 3=",fact(3))

コマンドラインからこのモジュールのデバッグを開始します。この場合、実行はコードの最初の行で停止します。その左側に矢印(->)を表示し、デバッガープロンプト(Pdb)を生成します

C:\python36>python -m pdb fact.py
> c:\python36\fact.py(1)<module>()
-> def fact(x):
(Pdb)

すべてのデバッガコマンドのリストを表示するには、デバッガプロンプトの前に「help」と入力します。コマンドの詳細については、「help」構文を使用してください。

Pythonデバッガー(pdb)

listコマンドは、プログラムが停止した行の左側に->記号が付いたコード全体を一覧表示します。

(Pdb) list
1 -> def fact(x):
2    f = 1
3    for i in range(1,x+1):
4 print (i)
5 f = f * i
6 return f
7 if __name__=="__main__":
8 print ("factorial of 3 = ", fact(3))

プログラムを1行ずつ移動するには、ステップまたは次のコマンドを使用します。

(Pdb) step
> c:\python36\fact.py(7)<module>()
-> if __name__=="__main__":
(Pdb) next
> c:\python36\fact.py(8)<module>()
-> print ("factorial of 3 = ", fact(3))
(Pdb) next
1
2
3
factorial of 3= 6
--Return--
> c:\python36\fact.py(8)<module>()->None
-> print ("factorial of 3 = ", fact(3))

stepコマンドとnextコマンドの主な違いは、stepコマンドを使用すると、関数内でプログラムが停止し、nextコマンドが呼び出された関数を実行して、その後停止することです。

C:\python36>python -m pdb fact.py
> c:\python36\fact.py(1)<module>()
-> def fact(x):
(Pdb) s
> c:\python36\fact.py(7)<module>()
-> if __name__=="__main__":
(Pdb) n
> c:\python36\fact.py(8)<module>()
-> print ("factorial of 3=",fact(3))
(Pdb) s
--Call--
> c:\python36\fact.py(1)fact()
-> def fact(x):
(Pdb) n
> c:\python36\fact.py(2)fact()
-> f = 1
(Pdb) n
> c:\python36\fact.py(3)fact()
-> for i in range(1,x+1):
(Pdb) n
> c:\python36\fact.py(4)fact()
-> print (i)
(Pdb) n
1
> c:\python36\fact.py(5)fact()
-> f = f * i
(Pdb) n
> c:\python36\fact.py(3)fact()
-> for i in range(1, x + 1):
(Pdb) n
> c:\python36\fact.py(4)fact()
-> print (i)
(Pdb) f,i
(1, 2)
(Pdb)

stepコマンドは、プログラムが関数の呼び出しに遭遇したときの--call—indicationと、関数が終了したときの--return---も表示します。いつでも、名前を入力するだけで特定の変数の値を確認できます。

breakコマンドでプログラム内にブレークポイントを設定できます。行番号(ブレークポイントを設定する場所)を指定する必要があります。たとえば、「break 5」は、現在のプログラムの5行目にブレークポイントを設定します。

(Pdb) list
2 f = 1
3 for i in range(1, x + 1):
4 print (i)
5 f = f * i
6 return f
7 -> if __name__=="__main__":
8 print ("factorial of 3=",fact(3))
[EOF]
(Pdb) break 5
Breakpoint 1 at c:\python36\fact.py:5
(Pdb) continue
1
> c:\python36\fact.py(5)fact()
-> f = f * i
(Pdb) break
Num Type Disp Enb Where
1 breakpoint keep yes at c:\python36\fact.py:5
breakpoint already hit 1 time
(Pdb) continue
2
> c:\python36\fact.py(5)fact()
-> f = f * i
(Pdb) b
Num Type Disp Enb Where
1 breakpoint keep yes at c:\python36\fact.py:5
breakpoint already hit 2 times

'continue'コマンドが発行されると、プログラムの実行はブレークポイントに到達するまで続行されます。すべてのブレークポイントを表示するには、行番号なしでbreakコマンドを発行するだけです。

ブレークポイントは、disable / enableコマンドで無効化/有効化するか、clearコマンドで完全にクリアすることができます。

(Pdb) disable 1
Disabled breakpoint 1 at c:\python36\fact.py:5
(Pdb) b
Num Type Disp Enb Where
1 breakpoint keep no at c:\python36\fact.py:5
breakpoint already hit 2 times
>

Pdbデバッガーは、Pythonスクリプト内からも使用できます。これを行うには、スクリプトの先頭にあるpdbをインポートし、プログラム内でset_trace()メソッドを使用します。

import pdb
def fact(x):
f = 1
for i in range(1,x+1):
pdb.set_trace()
print (i)
f = f * i
return f
if __name__=="__main__":
print ("factorial of 3=",fact(3))

デバッガーの動作は、コマンドライン環境で見られるものとまったく同じです。


  1. JavaScriptのデバッガーステートメント

    JavaScriptのデバッガーステートメントは、コードにブレークポイントを設定するために使用されます。コードは、デバッガーステートメントに遭遇するとすぐに実行を停止し、デバッガー関数(使用可能な場合)を呼び出します。 以下は、JavaScriptでデバッガステートメントを実装するためのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" co

  2. Pythonでのリストの内部動作

    このチュートリアルでは、Python3.xでのリストの内部動作について学習します。またはそれ以前。また、各ステップでpythonステートメントを作成するときに、オブジェクトとフレームの形成についても見ていきます。 リストの初期化:これは、いくつかの要素を含むリストを作成していることを意味します。 >>> lis=[1,2,3,4] ここで、リスト変数は、上記のようにリストオブジェクトを参照しているグローバルフレームで宣言されています 次に、リストに要素を追加したときに何が起こったかを見てみましょう。 >>> lis.append(8) こ