pdb — Python 调试器

源代码: Lib/pdb.py


pdb模块为 Python 程序定义了一个交互式源代码调试器。它支持在源代码行级别设置(条件)断点和单步执行,检查堆栈框架,源代码列表以及在任何堆栈框架的上下文中评估任意 Python 代码。它还支持事后调试,可以在程序控制下调用。

调试器是可扩展的–实际上定义为类Pdb。目前尚无记录,但pass阅读源代码很容易理解。扩展接口使用模块bdbcmd

调试器的提示是(Pdb)。在调试器的控制下运行程序的典型用法是:

>>> import pdb
>>> import mymodule
>>> pdb.run('mymodule.test()')
> <string>(0)?()
(Pdb) continue
> <string>(1)?()
(Pdb) continue
NameError: 'spam'
> <string>(1)?()
(Pdb)

在版本 3.3 中更改:passreadline模块完成制表符可用于命令和命令自变量,例如当前的全局名称和本地名称作为p命令的参数提供。

pdb.py也可以作为脚本调用来调试其他脚本。例如:

python3 -m pdb myscript.py

当作为脚本调用时,如果正在调试的程序异常退出,pdb 将自动进入事后调试。在事后调试之后(或在程序正常退出之后),pdb 将重新启动该程序。自动重启会保留 pdb 的状态(例如断点),并且在大多数情况下比在程序退出时退出调试器更为有用。

3.2 版中的新Function:pdb.py现在接受-c选项,该选项执行命令的方式就像.pdbrc文件中给出的一样,请参见Debugger Commands

3.7 版中的新Function:pdb.py现在接受-m选项,该选项执行与python3 -m相似的模块。与脚本一样,调试器将在模块第一行之前暂停执行。

从正在运行的程序进入调试器的典型用法是插入

import pdb; pdb.set_trace()

在您想进入调试器的位置。然后,您可以单步执行此语句之后的代码,并使用continue命令在没有调试器的情况下 continue 运行。

3.7 版中的新Function:内置breakpoint()(默认调用)可以代替import pdb; pdb.set_trace()使用。

检查崩溃程序的典型用法是:

>>> import pdb
>>> import mymodule
>>> mymodule.test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "./mymodule.py", line 4, in test
    test2()
  File "./mymodule.py", line 3, in test2
    print(spam)
NameError: spam
>>> pdb.pm()
> ./mymodule.py(3)test2()
-> print(spam)
(Pdb)

该模块定义了以下Function;每个都以略有不同的方式进入调试器:

在版本 3.7 中更改:仅关键字参数* header *。

run*函数和set_trace()是用于实例化Pdb类并调用相同名称的方法的别名。如果要访问其他Function,则必须自己执行以下操作:

默认情况下,当您发出continue命令时,Pdb 会为 SIGINTsignal 设置处理程序(当用户在控制台上按 Ctrl-C 时发送)。这使您可以pass按 Ctrl-C 再次进入调试器。如果不希望 Pdb 触摸 SIGINT 处理程序,请将* nosigint *设置为 true。

使用* skip *启用跟踪的示例调用:

import pdb; pdb.Pdb(skip=['django.*']).set_trace()

引发不带参数的auditing event pdb.Pdb

3.1 版中的新Function:* skip *参数。

版本 3.2 中的新Function:* nosigint *参数。以前,Pdb 从未设置过 SIGINT 处理程序。

在版本 3.6 中更改:* readrc *参数。

Debugger Commands

下面列出了调试器可以识别的命令。如所示,大多数命令可以缩写为一个或两个字母。例如h(elp)表示可以使用hhelpImporting 帮助命令(但不能 Importinghehel,也不能 ImportingHHelpHELP)。命令的参数必须用空格(空格或制表符)分隔。可选参数用命令语法括在方括号([])中;禁止 Importing 方括号。命令语法中的其他选项由竖线(|)分隔。

Importing 空白行将重复最后 Importing 的命令。exception:如果最后一个命令是list命令,则会列出接下来的 11 行。

调试器无法识别的命令被假定为 Python 语句,并在被调试程序的上下文中执行。 Python 语句也可以带有感叹号(!)作为前缀。这是检查正在调试的程序的强大方法。甚至可以更改变量或调用函数。当此类语句中发生异常时,将打印异常名称,但调试器的状态不会更改。

调试器支持aliases。别名可以具有允许对被检查的上下文有一定程度的适应性的参数。

可以在一行上 Importing 多个命令,并以;;分隔。 (不使用单个;,因为它是传递给 Python 解析器的一行中多个命令的分隔符.)没有智能可用于分隔命令。Importing 将在第一个;;对处拆分,即使它在带引号的字符串中间。

如果用户的主目录或当前目录中存在文件.pdbrc,则将其读入并执行,就像在调试器提示符下键入的一样。这对于别名特别有用。如果两个文件都存在,则首先读取主目录中的文件,并且本地文件可以覆盖其中定义的别名。

在版本 3.2 中更改:.pdbrc现在可以包含 continue 调试的命令,例如continuenext。以前,这些命令无效。

如果存在第二个参数,则该表达式必须在接受断点之前计算为 true。

不带参数的情况下,列出所有break,包括每个断点,命中该断点的次数,当前忽略计数以及关联的条件(如果有)。

(Pdb) commands 1
(com) p some_variable
(com) end
(Pdb)

要从断点删除所有命令,请键入commands并紧跟着end;也就是说,不要给出任何命令。

没有* bpnumber *参数,commands指向最后一个断点集。

您可以使用断点命令重新启动程序。只需使用continue命令或step或任何其他恢复执行的命令。

指定任何恢复执行的命令(当前为continuestepnextreturnjumpquit及其缩写)将终止命令列表(就像该命令紧随其后是结尾)。这是因为任何时候恢复执行(即使使用简单的下一步或步骤),都可能会遇到另一个断点,该断点可能具有自己的命令列表,从而导致执行哪个列表含糊不清。

如果在命令列表中使用“ silent”命令,则不会打印有关在断点处停止的常规消息。对于要打印特定消息然后 continue 的断点,这可能是理想的。如果没有其他命令可以打印任何内容,则看不到已达到断点的迹象。

使用行号,continue 执行,直到到达行号大于或等于该行的行为止。在这两种情况下,当当前帧返回时也要停止。

在版本 3.2 中更改:允许提供明确的行号。

应该注意的是,并非所有跳转都是允许的–例如,不可能跳转到for循环的中间或finally子句的中间。

当前帧中的当前行由->指示。如果正在调试异常,则该异常最初引发或传播的行由>>指示,如果该行与当前行不同。

版本 3.2 中的新Function:>>标记。

3.2 版中的新Function。

Note

也可以使用print(),但它不是调试器命令-执行 Python print()函数。

3.2 版中的新Function。

如果不使用表达式,请列出当前帧的所有显示表达式。

3.2 版中的新Function。

3.2 版中的新Function。

3.2 版中的新Function。

别名可以嵌套,并且可以包含可以在 pdb 提示符下合法键入的任何内容。请注意,内部 pdb 命令可以被别名覆盖。然后隐藏这样的命令,直到删除别名。别名以递归方式应用于命令行的第一个单词;该行中的所有其他单词都不要理会。

例如,以下是两个有用的别名(尤其是放在.pdbrc文件中时):

# Print instance variables (usage "pi classInst")
alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])
# Print instance variables in self
alias ps pi self
(Pdb) global list_options; list_options = ['-l']
(Pdb)

Footnotes

首页