Pdb ライブラリと一般的に使用されるコマンドを使用して Python をデバッグする方法
Python には独自の Pdb ライブラリが付属しており、Pdb を使用して Python プログラムをデバッグすると非常に便利であることは誰もが知っています。ただし、リモート デバッグとマルチスレッドは Pdb では処理できません。Pdb ライブラリを使用して Python と一般的に使用されるコマンドをデバッグする方法を見てみましょう。
Pdbを使用してデバッグする方法はたくさんあります
Pdbを使用してPythonプログラムをデバッグする主な方法は次の3つです!一つずつ紹介していきます
コマンドラインに-mパラメータを追加します
コマンドラインでターゲットプログラムを起動し、-mパラメータを追加します。このようにして、testPdb.pyが呼び出されるときに、ブレークポイントが設定されます。プログラム実行の最初の行の前になります
この記事の次の焦点上記の例は、この方法を使用してデバッグされています。
python -m pdb testPdb.py
Pythonインタラクティブ環境でのデバッグ
>>> import pdb >>> import testPdb >>> pdb.run('testPdb.test()')
プログラムをコードに挿入する
プログラムの途中にプログラムを挿入するのが一般的です。比較した一般的な IDE にブレークポイントを設定してデバッグを開始しますが、このメソッドは ハードコード
hardcode
的
if __name__ == "__main__": a = 1 import pdb pdb.set_trace() b = 2 c = a + b print(c)
然后正常运行脚本:python testPdb.py
到了 pdb.set_trace()
那里就会定下来,然后就可以看到调试的提示符 (Pdb)了
针对上面的这段小程序的调试情况如下:
准备测试程序
接下来使用上面介绍的第一种方式来调试 Python程序,以此来介绍 pdb常用的命令,不过在开始之前先要准备好测试的程序代码:
testFun.py
这是一个会被主模块调用的子模块,用于测试使用 Pdb调试的时候,是不是可以断点从主模块跟踪进入子模块(后续有说明)
#!/usr/bin/python # -*- coding: utf-8 -*- def add(a, b): return a + b
testPdb.py
这是下面被调试的主模块的代码
#!/usr/bin/python # -*- coding: utf-8 -*- def sub(a, b): return a - b if __name__ == "__main__": print '' import testFun i = 0 a = 1 while(i < 100): a = testFun.add(a, 1) i = i + 1 print "累加结果:", a print "" for letter in 'Pdb': print "当前字母:", letter print "" fruits = ['banana', 'apple', 'mango'] for fruit in fruits: print "当前水果:", fruit print "" ret = 0 for num in range(10, 12): ret = sub(ret, num) print '循环结果:', ret print "" d = {'abc': 123, 123: "abc"} for (k,v) in d.items(): print "当前键值对:", k, '-', v print ""
总结常用的命令
基础命令
h(elp)命令:会打印当前版本 Pdb可用的命令,如果要查询某个命令,可输入 h [command]
,例如 h l
查看 list命令
l(ist)命令:可以列出当前将要运行的代码块
断点管理
b(reak):设置断点
比如 b 12 就是在当前脚本的第 9行加上断点
比如 b sub 就是在当前脚本的 sub函数定义处加断点
除了可以在当前的脚本中添加断点之外,还可以在当前脚本对其他脚本下断点,以上面用到的代码为例 b testFun.add
就可以实现在 testFun.py脚本中的 add函数处加断点
如果只用 b 就会显示现有的全部断点
condition bpnumber [condition]:设置条件断点,比如 condition 2 a==0 ,就是在第二个断点出加条件 “a==0”
cl(ear):删除断点,如果后面带有参数,就是清楚指定的断点;如果不带参数就是清除所有的断点
disable/enable:禁用/激活断点
程序逻辑控制
下面展示的几个命令,需要知道对应的脚本的代码和行号,所以这里先截图展示下面测试需要用到的前几行代码
c(ont(inue)),让程序正常运行,直到遇到下一个断点
n(ext),让程序运行下一行,如果当前语句有一个函数调用,用n是不会进入被调用的函数体中的
下图中展示的,当对脚本断点调试到 testFun.add(a, 1)
时,继续执行n,并不会进入 testFun.add(a, 1)
的函数内部
s(tep),跟n相似,但如果当前有一个函数调用,那么 s会进入被调用的函数体中
下图中展示的,当对脚本断点调试到 testFun.add(a, 1)
时,继续执行s,会进入 testFun.add(a, 1)
对应的函数定义内部,虽然 testFun.add
不是本脚本中定义的函数
j(ump),让程序跳转到指定的行数
假如当前所在行是 10,注意:假如执行了 j 20 之后,那么相当于程序直接跳到 20行,中间的 11~19行其实就直接跳过去根本没有被执行到,所以如果这段代码中有变量的声明或对象的初始化需要在 20行及之后被用到,那么等到用到的时候就可能导致报错!
打印重要信息
a(rgs),打印当前函数的参数。比如下图就是展示断点进入到 testFun.add
内部之后,打印 testFun.add
rrreee
次に、スクリプトを通常どおり実行します: python testPdb.py
to pdb.set_trace()
がそこに設定され、デバッグプロンプト (Pdb) が表示されます
テストプログラムを準備します
次に、上で紹介した最初の方法を使用して Python プログラムをデバッグし、一般的に使用される pdb コマンドを導入します。ただし、開始する前に、テスト プログラム コードを準備する必要があります:
h [command]
と入力します。たとえば、h l
と入力すると、リスト コマンドが表示されます 🎜 🎜l(ist) コマンド: 現在実行中のコマンドをリストできます。 コードブロック🎜🎜🎜ブレークポイント管理🎜🎜🎜🎜 b(reak): ブレークポイントを設定します🎜🎜たとえば、b 12 は行にブレークポイントを追加します。現在のスクリプトの 9 🎜🎜たとえば、 b sub は現在のスクリプトのサブ関数定義です ブレークポイントの追加🎜🎜 現在のスクリプトにブレークポイントを追加するだけでなく、現在のスクリプト内の他のスクリプトにもブレークポイントを設定することもできます。例として上で使用したコード b testFun.add
testFun.py スクリプトの add 関数でブレークポイントを追加できます🎜🎜🎜 b のみを使用する場合は、既存のブレークポイントがすべて表示されます🎜🎜🎜条件bpnumber [条件]: 条件 2 a ==0 などの条件付きブレークポイントを設定します。つまり、2 番目のブレークポイントに条件「a==0」を追加します。 🎜🎜cl(ear): ブレークポイントがある場合は、ブレークポイントを削除します。パラメーターの後には、指定されたブレークポイントが表示されます。パラメーターがない場合は、クリアされます。対応するスクリプトのコードと行番号。次のテストを示すスクリーンショットです。使用する必要があるコードの最初の数行🎜🎜c(ont(inue))、次のブレークポイントまでプログラムを通常どおり実行させます。 🎜🎜n(ext) が発生しました。プログラムに次の行を実行させます。現在のステートメントに関数呼び出しがある場合、n を使用すると、呼び出された関数本体には入りません 🎜🎜下の図に示すように、スクリプト ブレークポイントをデバッグするときに、 testFun.add(a, 1)
、実行を継続します。n、testFun.add(a, 1)
内の関数には入りません 🎜🎜s(tep)、これは n に似ていますが、現在関数呼び出しがある場合、 s は呼び出された関数の本体に入ります。 以下の図に示すように、デバッグ時にスクリプト ブレークポイントが testFun.add(a, 1)
に設定されます。 > を実行し続けると、対応する関数定義内に testFun.add(a, 1)
が入力されます。ただし、testFun.add
はこのスクリプトで定義されている関数ではありません。 🎜🎜j(ump)、指定された行番号にプログラムをジャンプさせます🎜🎜現在行が10の場合。 注: j 20 が実行されると、プログラムが直接20行にジャンプするのと同じです。 真ん中の行11~ 19行目は実際には直接スキップされて全く実行されないので、20行目以降で変数宣言やオブジェクトの初期化を使用する必要があるため、使用するとエラーになる可能性があります。 🎜🎜🎜重要な情報を出力します🎜🎜🎜🎜a(rgs)、現在の関数のパラメータを出力します。たとえば、下の図は、ブレークポイントが testFun.add
の内部に入った後、 testFun.add
のパラメーター 🎜🎜p が出力され、特定の変数が🎜🎜🎜を印刷してデバッグを終了します🎜🎜 🎜🎜q、デバッグを直接終了するか、Ctrl+Dを使用して終了します🎜🎜🎜🎜概要🎜🎜🎜🎜上記の Pdb を使用したデバッグのプロセスは、実際には非常に簡単です。この記事では、主にスクリーンショットを通じて実行時の効果を示しています。記事を読むだけではまったく理解できず、コマンドやスクリーンショットの出力も雑に感じるかもしれませんが、自分でプロセスを実行すると、1 時間もかからずに効果が得られます。絶対に素晴らしい!もう 1 つ、Python のデバッガは Linux で C デバッガ gdb を学習するために使用できる Pdb です。以上がこの記事の全内容です。皆さんの学習や作業に役立つことを願っています。
Pdb ライブラリを使用して Python をデバッグする方法と一般的に使用されるコマンドに関するその他の記事については、PHP 中国語 Web サイトに注目してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

この記事では、numpy、pandas、matplotlib、scikit-learn、tensorflow、django、flask、and requestsなどの人気のあるPythonライブラリについて説明し、科学的コンピューティング、データ分析、視覚化、機械学習、Web開発、Hの使用について説明します。

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法
