ホームページ  >  記事  >  バックエンド開発  >  Pdb ライブラリと一般的に使用されるコマンドを使用して Python をデバッグする方法

Pdb ライブラリと一般的に使用されるコマンドを使用して Python をデバッグする方法

高洛峰
高洛峰オリジナル
2017-02-25 11:00:281259ブラウズ

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 &#39;Pdb&#39;:
  print "当前字母:", letter
 print ""

 fruits = [&#39;banana&#39;, &#39;apple&#39;, &#39;mango&#39;]
 for fruit in fruits:
  print "当前水果:", fruit
 print ""


 ret = 0
 for num in range(10, 12):
  ret = sub(ret, num)
 print &#39;循环结果:&#39;, ret
 print ""

 d = {&#39;abc&#39;: 123, 123: "abc"}
 for (k,v) in d.items():
  print "当前键值对:", k, &#39;-&#39;, 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 コマンドを導入します。ただし、開始する前に、テスト プログラム コードを準備する必要があります:

🎜🎜testFun.py🎜🎜🎜🎜これです。メインモジュールによって呼び出されるサブモジュール。Pdb を使用してデバッグするときに、メインモジュールからサブモジュールにブレークポイントをトレースできるかどうかをテストするために使用されます (説明は後で説明します)🎜🎜🎜rrreee🎜🎜🎜🎜testPdb.py 🎜🎜 🎜🎜これは以下でデバッグされているメインモジュールのコードです🎜​​🎜🎜rrreee🎜🎜🎜🎜🎜よく使用されるコマンドの概要🎜🎜🎜🎜🎜🎜基本コマンド🎜🎜🎜🎜h (elp) コマンドは次のとおりです。印刷する現在のバージョンの 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 サイトに注目してください。

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