目次
1. pdb
2. pdb 基本コマンド
3.break コマンドを使用して、指定したファイルの指定した場所にブレークポイントを設定します
3.2 その他の場合 ファイル内の指定した場所にブレークポイントを設定する " >3.2 その他の場合 ファイル内の指定した場所にブレークポイントを設定する
4 のように、相対パスの下のファイル名を使用してブレークポイントを設定することもできます。 . pdb 使用時に発見された問題
4.1 ソフト リンクを使用すると、pdb で表示されるファイル パスが実際のパスと一致しない" >4.1 ソフト リンクを使用すると、pdb で表示されるファイル パスが実際のパスと一致しない
4.2 pdb はモデルの forward() メソッドにブレークポイントを追加できない場合があります" >4.2 pdb はモデルの forward() メソッドにブレークポイントを追加できない場合があります
ホームページ バックエンド開発 Python チュートリアル Pythonデバッグツールpdb(Python Debugger)の使い方まとめ

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

Nov 07, 2022 pm 04:46 PM
python

この記事では、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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

崇高なテキストでPythonコードを実行する方法は? 崇高なテキストでPythonコードを実行する方法は? Aug 16, 2025 am 04:58 AM

Pythonがインストールされ、システムパスに追加されていることを確認し、Python(versionまたはpython3-version Verification from terminal)を実行してください。 2。hello.pyなどの.py拡張子としてpythonファイルを保存します。 3. sublimetextでカスタムビルドシステムを作成する、Windowsユーザーは{"cmd":["python"、 "-u"、 "$ file"]}を使用します。

VSCODEでPythonスクリプトをデバッグする方法 VSCODEでPythonスクリプトをデバッグする方法 Aug 16, 2025 am 02:53 AM

Pythonスクリプトをデバッグするには、最初にPython拡張子をインストールしてインタープリターを設定し、Launch.jsonファイルを作成してデバッグ構成を設定する必要があります。次に、コードにブレークポイントを設定し、F5を押してデバッグを開始する必要があります。スクリプトはブレークポイントで一時停止され、チェック変数と段階的な実行が可能になります。最後に、コンソールの出力を表示したり、ログを追加したり、パラメーターを調整したりするなどして問題を確認して、環境が正しい後にデバッグプロセスがシンプルで効率的であることを確認します。

Pythonのクラスメソッドは何ですか Pythonのクラスメソッドは何ですか Aug 21, 2025 am 04:12 AM

classMethodsinpythonareboundtotheclassandottoinstances、creatinginganobject.1.theyReadeDefinedTheSusingsingsisingsisthedtaklsasthefirstparameter、referringtotheclassiT self.2

Python Asyncioキューの例 Python Asyncioキューの例 Aug 21, 2025 am 02:13 AM

Asyncio.Queueは、非同期タスク間の安全な通信のためのキューツールです。 1.プロデューサーはawaitqueue.put(item)を介してデータを追加し、消費者はwaitqueue.get()を使用してデータを取得します。 2。処理する各アイテムについて、queue.task_done()を呼び出して、queue.join()がすべてのタスクを完了するのを待つ必要があります。 3。消費者に停止するように通知するために、最終信号としてなしを使用します。 4.複数の消費者の場合、複数のエンド信号を送信する必要があります。または、タスクをキャンセルする前にすべてのタスクを処理する必要があります。 5.キューは、マックスサイズの制限容量の設定をサポートし、操作を自動的に一時停止して取得し、イベントループをブロックしません。プログラムは最終的にCANCを通過します

収量キーワードはPythonでどのように機能しますか 収量キーワードはPythonでどのように機能しますか Aug 15, 2025 am 08:23 AM

収量キーワードは、ジェネレーター関数を定義するために使用されます。これにより、実行と値を1つずつ返すことができ、一時停止から回復できます。ジェネレーター関数はジェネレーターオブジェクトを返し、怠zyな評価特性を持ち、メモリを保存できます。大規模なファイル、ストリーミングデータ、無限のシーケンスなどのシナリオを処理するのに適しています。ジェネレーターは、次の()とループをサポートするが、巻き戻すことはできず、再び反復するために再現する必要があるイテレーターです。

崇高なテキストでPythonプロジェクトを作成する方法は? 崇高なテキストでPythonプロジェクトを作成する方法は? Aug 16, 2025 am 08:53 AM

InstallSublimeTextandPython,thenconfigureabuildsystembycreatingaPython3.sublime-buildfilewiththeappropriatecmdandselectorsettingstoenablerunningPythonscriptsviaCtrl B.2.OrganizeyourprojectbycreatingadedicatedfolderwithPythonfilesandsupportingdocument

Pythonスクリプトを実行し、崇高なテキストの別のパネルに出力を表示する方法は? Pythonスクリプトを実行し、崇高なテキストの別のパネルに出力を表示する方法は? Aug 17, 2025 am 06:06 AM

toseepythonoutputinaseparatepanelinsublimeText、usethebuilt-inbuildsystemsystemvisavingyourfilewitha.pyextensionandpressingctrl b(orcmd b).2.ensuretecortecortecortecortecorretecortecortecortecortecortecortecortecortecortecortecortecortemsystemselected byoveringtotools

PythonでWebスクレイピング中にブロックされないようにするにはどうすればよいですか? PythonでWebスクレイピング中にブロックされないようにするにはどうすればよいですか? Aug 16, 2025 am 09:54 AM

whilewebscrapingwiththon、userealisticrequestheaders、addrandomizeddelays、rotateipaddressesseswithproxies、maintiness ofsions、rectionrobots.txt、およびusehead ress browsersは、保証されています

See all articles