ホームページ  >  記事  >  バックエンド開発  >  Pythonデバッグツールpdb(Python Debugger)の使い方まとめ

Pythonデバッグツールpdb(Python Debugger)の使い方まとめ

WBOY
WBOY転載
2022-11-07 16:46:036276ブラウズ

この記事では、Python に関する関連知識を提供します。主に、基本的な pdb コマンド、break によるブレークポイントの設定など、pdb デバッグ ツールに関する関連コンテンツを紹介します。一緒に見てみましょう。 , 皆様のお役に立てれば幸いです。

Pythonデバッグツールpdb(Python Debugger)の使い方まとめ

[関連する推奨事項: Python3 ビデオ チュートリアル ]

1. pdb

を使用するには 2 つの方法があります。 pdb: python debugger

1. 非侵入的な方法 (ソース コードを変更する必要はなく、コマンド ラインから直接実行してデバッグできます)

python3 -m pdb filename.py

2.侵入的なメソッド (デバッグ中のコードに次のコードを追加して、コードを通常どおり実行する必要があります)

PDB をインポートする pdb.set_trace()

コマンド ラインに次のプロンプトが表示されたら、pdb が正しく開かれたことを意味します

(Pdb)

2. pdb 基本コマンド

#step または s関数を入力します (for ループに入るには、step の代わりに next を使用します)return または r現在の関数から戻るまでコードを実行 next または nExecute次の行up または u前の呼び出しポイントに戻ります (前の行ではありません) p x印刷変数 ## の値

実際に使用してみると、シェルスクリプトでPythonファイルを実行すると、pdbを使用したデバッグができずに終了してしまう場合があります。現時点では、デバッグのために py ファイルを直接実行することのみが可能です。

3.break コマンドを使用して、指定したファイルの指定した場所にブレークポイントを設定します

3.1 このファイルの指定した場所にブレークポイントを設定します

たとえば、次の例では、モデルの forward() メソッドを入力して順伝播中のデータ処理プロセスを表示する場合、最初の行にブレークを設定することしかできません。ポイント、pdb.set_trace()

ただし、モデルが非常に複雑な場合があり、このメソッドを使用すると、プログラムがエラーを報告して直接終了します (私はそうしません)理由がわかっている場合は、ここで Break コマンドを使用することを検討できます。ブレークポイントを 1 行に挿入して、forward() に到達したときにプログラムが停止するようにします。

import torchimport torch.nn as nnimport pdbclass EncoderLayer(nn.Module):    def __init__(self):        super().__init__()
        self.conv1 = nn.Conv2d(4, 10, (3, 3))
        self.conv2 = nn.Conv2d(10, 4, (3, 3))
        self.relu = nn.ReLU()    def forward(self, x):
        x=self.relu(self.conv1(x))        return self.relu(self.conv2(x))class Encoder(nn.Module):    def __init__(self,num_layers):        super().__init__()        # encoders 由 num_layers个 EncoderLayer子层组成,每个子层结构相同,但参数不一定相同。
        self.ModelList = nn.ModuleList([EncoderLayer() for _ in range(num_layers)])    def forward(self, x):        # ModuleList是一个list,只能通过list的操作方式(如用for循环、下标索引等)进行forward计算。
        for layer in self.ModelList:
            x = layer(x)        return xif __name__=="__main__":
    pdb.set_trace()   
    input = torch.rand(5, 4, 30, 30)
    model = Encoder(num_layers=4)
    output = model(input)

具体的な方法: (1) まず、前の行で pdb.set_trace() を設定してプログラムを停止します。 (2) ブレーク 26 を入力するだけです。図に示すように:

Pythonデバッグツールpdb(Python Debugger)の使い方まとめこのようにして、ブレークポイントは正常に設定され、プログラムは forward() に到達すると停止します。

ここでの 26 は行数です。 ブレークポイントの位置をコメント にすることはできないことに注意してください。たとえば、25 行目 (コメント行) にブレークポイントを設定すると、次のようになります。失敗します:

Pythonデバッグツールpdb(Python Debugger)の使い方まとめ要約すると、同じファイルにブレークポイントを設定するコマンドは次のとおりです:

break line

3.2 その他の場合 ファイル内の指定した場所にブレークポイントを設定する

#設定したいブレークポイントが初期実行ファイルにない場合、ブレーク ポイントをどのように使用できますか?他のファイルにブレークポイントを設定するコマンドは?この例を見てみましょう:

3.1 コードを 3 つの py ファイルに分割し、同じパスの下に置きます:

  ![Pythonデバッグツールpdb(Python Debugger)の使い方まとめ](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4b5d476ba5b14b0ba541d78930b9704a~tplv-k3u1fbpfcp-zoom-1.image)

各ファイルの内容を見てください:

run.py:

pdb.set_trace() の初期設定は run.py にあります。

import torchfrom encoder import Encoderimport pdbif __name__=="__main__":
    pdb.set_trace()    input = torch.rand(5, 4, 30, 30)
    model = Encoder(num_layers=4)
    output = model(input)

encoder.py:

from encoder_layer import EncoderLayerimport torch.nn as nnclass Encoder(nn.Module):    def __init__(self,num_layers):        super().__init__()        # encoders 由 num_layers个 EncoderLayer子层组成,每个子层结构相同,但参数不一定相同。
        self.ModelList = nn.ModuleList([EncoderLayer() for _ in range(num_layers)])    def forward(self, x):        # ModuleList是一个list,只能通过list的操作方式(如用for循环、下标索引等)进行forward计算。
        for layer in self.ModelList:
            x = layer(x)        return x

encoder_layer.py:

import torch.nn as nnclass EncoderLayer(nn.Module):    def __init__(self):        super().__init__()
        self.conv1 = nn.Conv2d(4, 10, (3, 3))
        self.conv2 = nn.Conv2d(10, 4, (3, 3))
        self.relu = nn.ReLU()    def forward(self, x):
        x=self.relu(self.conv1(x))        return self.relu(self.conv2(x))

ここで、run.py を実行してから Set encoder.py の 12 行目にあるブレークポイント、つまり self.ModelList:

のレイヤーの

コマンドは次のとおりです:

break encoder.py:12

つまり、break filename: linePythonデバッグツールpdb(Python Debugger)の使い方まとめプログラムは、output = model(input):Pythonデバッグツールpdb(Python Debugger)の使い方まとめから forward() に入ることができることがわかります。デバッグに非常に便利です。

最初のブレークポイントとターゲット ブレークポイントが同じディレクトリ内のファイルにない場合は、

(Pdb) break ../transformer/asr_model.py:91Breakpoint 1 at /local/wenet/examples/aishell/s0/wenet/transformer/asr_model.py:91(Pdb)

4 のように、相対パスの下のファイル名を使用してブレークポイントを設定することもできます。 . pdb 使用時に発見された問題

4.1 ソフト リンクを使用すると、pdb で表示されるファイル パスが実際のパスと一致しない

次のように図中、pdb これは 3 行で構成されており、1 行目はファイルパス、2 行目は現在実行されているコード行、3 行目は入力コマンドラインです。

ソフトリンクがある場合、pdbで表示されるパスはソフトリンクが指すパスですが、実際のコードパスはソフトリンクの内容をコピーしたパスになります。これら2つのパスは異なります。だから注意しなければなりません。 Pythonデバッグツールpdb(Python Debugger)の使い方まとめ

4.2 pdb はモデルの forward() メソッドにブレークポイントを追加できない場合があります

pdbpdb を使用できない場合があります。 set_trace( ) モデルの forward() メソッドにブレークポイントを追加します。エラー メッセージは次のとおりです:

#コンパイルされた関数は可変数の引数を取ることも、デフォルトでキーワードのみの引数を使用することもできません

おそらく、「コンパイルされた関数は可変数のパラメーターを受け入れることができません。また、デフォルトではキーワードのみのパラメーターを使用することもできません。」ということを意味します。

意味がわかりませんが、この問題は解決されていない。

5. プログラムがクラッシュした後のポストデバッグ: pdb.pm()

前述したように、プログラムの実行開始時にブレークポイントが挿入され、デバッグには pdb が使用されます。

プレデバッグ。実際、pdb は事後デバッグにも使用できます。つまり、プログラムにバグがありクラッシュした後、Python デバッガーを使用してそれを表示します。

たとえば、test.py には明らかにバグがあります:

# test.pydef add(n):    return n+1add("hello")
直接実行:

python test.py

プログラム折りたたむ:

F:\PycharmProjects\pytorch_practice>python test.py
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    add("hello")
  File "test.py", line 2, in add
    return n+1
TypeError: can only concatenate str (not "int") to str</module>
この方法では、デバッグに pdb を使用できません。では、プログラムがクラッシュした場合、どのようにデバッグすればよいのでしょうか?

簡単なデバッグには次のコマンドを使用できます:

python -i test.py

-i オプションを使用すると、対話型シェルを開くことができます、 次のように: ###
F:\PycharmProjects\pytorch_practice>python -i test.py
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    add("hello")
  File "test.py", line 2, in add
    return n+1
TypeError: can only concatenate str (not "int") to str
>>></module>

现在我们发现程序结束后出现了 >>> 符号,这就是python调试器。

输入命令:

import pdb pdb.pm()

其中 pdb.pm() 用于程序发生异常导致奔溃后的事后调试,可以跟踪异常程序最后的堆在信息。

执行命令后得到:

TypeError: can only concatenate str (not "int") to str
>>> import pdb
>>> pdb.pm()
> f:\pycharmprojects\pytorch_practice\test.py(2)add()
-> return n+1
(Pdb)

可以发现,pdb.pm() 已经追踪到了导致程序奔溃的语句:return n+1

此时可以打印 n 的值进行检查:

(Pdb) p n'hello'(Pdb) q>>> quit()

F:\PycharmProjects\pytorch_practice>

q 表示退出pdb调试,quit() 表示退出 python 调试器。

【相关推荐:Python3视频教程

コマンド 説明
Break または b ブレークポイントを設定します
continue または c プログラムの実行を継続します
list または l 現在の行のコード セグメントを表示します

以上がPythonデバッグツールpdb(Python Debugger)の使い方まとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。