Break または b |
ブレークポイントを設定します |
continue または c |
プログラムの実行を継続します |
list または l |
現在の行のコード セグメントを表示します |
#step または s | 関数を入力します (for ループに入るには、step の代わりに next を使用します) |
return または r | 現在の関数から戻るまでコードを実行 |
next または n | Execute次の行 |
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 を入力するだけです。図に示すように:
このようにして、ブレークポイントは正常に設定され、プログラムは forward() に到達すると停止します。
ここでの 26 は行数です。 ブレークポイントの位置をコメント にすることはできないことに注意してください。たとえば、25 行目 (コメント行) にブレークポイントを設定すると、次のようになります。失敗します:
要約すると、同じファイルにブレークポイントを設定するコマンドは次のとおりです:
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: lineプログラムは、output = model(input):から 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つのパスは異なります。だから注意しなければなりません。
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视频教程 】