Pdb简介

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

调试器是可扩展的–实际上定义为class Pdb。目前尚无记录,但通过阅读源代码很容易理解。扩展接口使用模块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中进行了更改:通过readline模块的制表符补全可用于命令和命令自变量,例如,将当前的全局名和本地名作为p命令的自变量提供。

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

python3 -m pdb myscript.py

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

3.2版中的新功能:pdb.py现在接受一个-c选项,该选项可以像在.pdbrc文件中给出的那样执行命令,请参阅下文调试器命令。

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

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

import pdb; pdb.set_trace()

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

3.7版的新功能: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 testtest2()File "./mymodule.py", line 3, in test2print(spam)
NameError: spam
>>> pdb.pm()
> ./mymodule.py(3)test2()
-> print(spam)
(Pdb)

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

pdb.run(语句,globals = None,locals = None )

在调试器的控制下执行语句(以字符串或代码对象的形式提供)。在执行任何代码之前,调试器提示会出现;您可以设置断点并输入continue,也可以使用step或逐步执行该语句next(下面将解释所有这些命令)。可选的globals和locals参数指定执行代码的环境;默认情况下,使用模块的字典__main__。(请参阅内置 exec()或eval()功能的说明。)

pdb.runeval(expression,globals = None,locals = None )[源代码)

在调试器控制下评估表达式(以字符串或代码对象形式给出)。当runeval()返回时,它返回表达式的值。否则,此功能类似于run()。

pdb.runcall(函数,* args,** kwds )

使用给定的参数调用函数(函数或方法对象,而不是字符串)。当runcall()返回时,它返回无论函数调用返回。输入功能后,调试器提示就会出现。

pdb.set_trace(*,header = None )

在调用堆栈框架处输入调试器。即使未对代码进行调试(例如,断言失败时),这也有助于在程序中给定点硬编码断点。如果给定, 则会在调试开始之前将标头打印到控制台。

在版本3.7中更改:仅关键字参数标头。

pdb.post_mortem(traceback = None )

输入给定回溯对象的事后调试。如果没有 给出回溯,它将使用当前正在处理的异常之一(如果要使用默认值,则必须处理异常)。

pdb.pm()

输入在中找到的追溯的事后调试 sys.last_traceback。

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

类pdb.Pdb(completekey ='tab',stdin = None,stdout = None,skip = None,nosigint = False,readrc = True )

Pdb 是调试器类。

该completekey,标准输入和标准输出参数被传递到底层cmd.Cmd阶级; 看到那里的描述。

在跳跃的说法,如果有,必须是一个迭代的通配符式样的模块名称模式。调试器将不会进入源自与这些模式之一匹配的模块的框架。

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

该readrc参数默认为真,控制是否将PDB从文件系统加载.pdbrc文件。

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

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

引发不带参数的审核事件 pdb.Pdb。

新的3.1版:在跳跃的说法。

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

改变在3.6版本:该readrc参数。

run(语句,globals = None,locals = None )
runeval(expression,globals = None,locals = None )[源代码)
runcall(函数,* args,** kwds )
set_trace()

有关上述功能的信息,请参阅文档。

调试器命令

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

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

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

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

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

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

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

h(elp) [command]

不带参数的情况下,显示可用命令的列表。以命令作为参数,输出有关该命令的帮助。 显示完整的文档(模块的文档字符串)。由于命令 参数必须是标识符,因此必须输入以获得命令帮助。help pdbpdbhelp exec!

w(here)

打印堆栈跟踪,最新一帧在底部。箭头指示当前框架,该框架确定大多数命令的上下文。

d(own) [count]

在堆栈跟踪中将当前帧计数(默认为一个)下移(至新的帧)。

u(p) [count]

在堆栈跟踪中将当前帧计数(默认为一个)上移(至较旧的帧)。

b(reak) [([filename:]lineno | function) [, condition]]

使用lineno参数,在当前文件中在那里设置一个中断。使用 函数参数,在该函数中的第一个可执行语句处设置一个中断。行号可以以文件名和冒号作为前缀,以在另一个文件(可能是尚未加载的文件)中指定一个断点。在上搜索该文件sys.path。请注意,为每个断点分配了一个编号,所有其他断点命令都引用该编号。

如果存在第二个参数,则它是一个必须接受断点之前必须为true的表达式。

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

tbreak [([filename:]lineno | function) [, condition]]

临时断点,在第一次命中时会自动删除。参数与相同break。

cl(ear) [filename:lineno | bpnumber ...]

使用filename:lineno参数,清除此行上的所有断点。用空格分隔的断点列表,清除这些断点。不加争议地清除所有中断(但首先请确认)。

disable [bpnumber ...]

禁用以空格分隔的断点编号列表形式给出的断点。禁用断点意​​味着它不会导致程序停止执行,但是与清除断点不同,它保留在断点列表中并且可以(重新)启用。

enable [bpnumber ...]

启用指定的断点。

ignore bpnumber [count]

设置给定断点号的忽略计数。如果忽略count,则忽略计数将设置为0。当忽略计数为零时,断点将变为活动状态。如果为非零值,则每次达到断点且不禁用断点时,计数都会递减,并且任何关联条件的评估结果为true。

condition bpnumber [condition]

为断点设置一个新条件,该表达式必须在接受断点之前求值为true。如果条件不存在,任何现有的条件被移除; 即,将断点设为无条件。

commands [bpnumber]

指定断点编号bpnumber的命令列表。命令本身出现在以下几行中。键入仅包含一行 end以终止命令。一个例子:

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

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

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

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

指定任何命令恢复执行(目前continue,step,next, return,jump,quit和它们的缩写)终止命令列表(如果该命令后立即进行到底)。这是因为任何时候恢复执行(即使是简单的下一步或步骤),都可能会遇到另一个断点,该断点可能具有自己的命令列表,这导致要执行哪个列表含糊不清。

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

s(tep)

执行当前行,在第一次可能的情况下停止(在调用的函数中或在当前函数的下一行中停止)。

n(ext)

继续执行,直到到达当前函数的下一行或它返回为止。(之间的差next和step是step一个被调用的函数内停止,而next 执行在(几乎)全速,仅在当前函数的下一行停止调用的函数。)

unt(il) [lineno]

不带参数的情况下,继续执行,直到到达行号大于当前行的行为止。

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

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

r(eturn)

继续执行直到当前函数返回。

c(ont(inue))

继续执行,仅在遇到断点时停止。

j(ump) lineno

设置将要执行的下一行。仅在最底部的框架中可用。这使您可以跳回并再次执行代码,或跳到跳过不想运行的代码。

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

l(ist) [first[, last]]

列出当前文件的源代码。不带参数的情况下,在当前行周围列出11行,或继续上一个列表。以.作为参数,在当前行周围列出11行。使用一个参数,在该行周围列出11行。用两个参数列出给定的范围;如果第二个参数小于第一个参数,则将其解释为一个计数。

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

新的3.2版本:该>>标记。

ll | longlist

列出当前功能或框架的所有源代码。有趣的行标记为list。

3.2版中的新功能。

a(rgs)

打印当前函数的参数列表。

p expression

在当前上下文中评估表达式并打印其值。

注意 print()也可以使用,但不是调试器命令-这将执行Pythonprint()函数。

pp expression

像p命令一样,除了表达式的值是使用pprint模块漂亮打印的。

whatis expression

打印表达式的类型。

source expression

尝试获取给定对象的源代码并显示它。

3.2版中的新功能。

display [expression]

每次在当前帧中停止执行时,显示表达式的值(如果更改)。

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

3.2版中的新功能。

undisplay [expression]

在当前帧中不再显示该表达式。如果没有表达式,请清除当前帧的所有显示表达式。

3.2版中的新功能。

interact

启动一个交互式解释器(使用code模块),该解释器的全局名称空间包含在当前作用域中找到的所有(全局和本地)名称。

3.2版中的新功能。

alias [name [command]]

创建一个名为name的别名,该别名执行command。该命令 不能用引号引起来。可替换的参数可以通过指示 %1,%2等,而%*由所有的参数替换。如果未给出命令,则显示名称的当前别名。如果未提供任何参数,则会列出所有别名。

别名可以嵌套,并且可以包含可以在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
unalias name

删除指定的别名。

! statement

在当前堆栈框架的上下文中执行(单行)语句。除非语句的第一个单词类似于调试器命令,否则可以省略感叹号。要设置全局变量,可以在赋值命令的前面加上一条global语句,例如:

(Pdb) global list_options; list_options = ['-l']
(Pdb)
run [args ...]
restart [args ...]

重新启动调试的Python程序。如果提供了参数,则将其与拆分,shlex并将结果用作new sys.argv。历史记录,断点,操作和调试器选项将保留。 restart是的别名run。

q(uit)

从调试器退出。正在执行的程序被中止。

debug code

输入一个递归调试器,它逐步遍历code参数(这是要在当前环境中执行的任意表达式或语句)。

retval

打印函数的最后一次返回的返回值。

脚注

帧是否被认为起源于某个模块由__name__帧全局变量确定。

Python调试器-Pdb的简介及调试命令相关推荐

  1. 【Python基础】Python调试器pdb

    Python调试器pdb 1. pdb简介 2. pdb调试 2.1 pdb常用命令 2.2 pdb实例 更新历史: 2022年12月6日完成初稿 最近在写项目代码,其中需要在Vscode上写pyth ...

  2. python文档测试_【Python入门】19.调试器pdb、单元测试unittest和文档测试doctest

    笔记更新于2019年12月4日, 摘要:各种调试方法介绍assert.logging.调试器pdb:单元测试unittest的编写方法.如何运行单元测试:文档测试doctest的编写 写在前面:为了更 ...

  3. 【Python】Python调试器pdb

    Python调试器pdb使用 PDB调用启动方法 PDB常用命令 PDB调用启动方法 pdb有2种用法: 非侵入式(不用额外修改源代码,在命令行下直接运行就能调试) python3 -m pdb fi ...

  4. Python调试器-Pdb

    晚上在debug代码的时候,发现有的时候,源码没有问题,控制台处也有运行结果,但是没法看到变量情况.这对理解代码很不方便.原因可能是因为数据量太大了,导致后面加载变量的时候可能内存爆了 处理方式:Pd ...

  5. python pdb 安装_入门 Python 调试器 pdb

    前言 调试线上的 Python 程序时,虽然 PyCharm 可以实现远程调试,但 pdb 才是最便捷的方式,本文简单介绍 pdb 工具的使用,希望各位除了掌握 PyCharm 调试技巧外,还可以掌握 ...

  6. Linux系统编程6:入门篇之如何拿下gdb调试器?来和我一起调试一个程序

    文章目录 (1)debug与release (2)调试一个程序 (3)总结-gdb选项 (1)debug与release 程序的发布方式有debug和release两种模式,release没有调试信息 ...

  7. pdb—Python调试器

    pdb-Python调试器 在python 3.8文档 Python 常用指引中已经详细介绍了pdb模块,此处为引用官方文档 该模块pdb为Python程序定义了一个交互式源代码调试器.它支持在源代码 ...

  8. python:pdb --- Python 的调试器

    python:pdb --- Python 的调试器 pdb 模块定义了一个交互式源代码调试器,用于 Python 程序.它支持在源码行间设置(有条件的)断点和单步执行,检视堆栈帧,列出源码列表,以及 ...

  9. The python debugger调试(PDB)的简介

    学习Python调试,最好的资料当然是官方文档和(pdb)help了,这里有篇博文,还有下面的 PDB cheat-sheet 1 在python中使用pdb模块可以进行调试 import pdb p ...

最新文章

  1. 人工智能时代,开发者是逆袭还是走向末日?
  2. 揭秘特斯拉自动驾驶雄心:最大优势非算法或技术而是海量数据
  3. Mac下python3配置opencv3 3和Mac下单独opencv的配置以及iOS下配置opencv
  4. inject 响应式_vue 的 provide 和 inject 依赖注入与 $parent
  5. 关于扫描仪——你不知道的秘密
  6. python编程经典案例-精心整理!9个 Python 实用案例分享
  7. 如何在钉钉上开发自己的应用_神操作!老妈让我告诉老板,双十一买钉钉。
  8. python读取文件数据堆栈溢出的原因_堆栈溢出一般是什么原因?
  9. jmeter5实现mysql数据库值提取--单sql提取
  10. 什么是数据治理的方法论
  11. php ci的session和php session,php及codeigniter使用session-cookie的方法(详解)
  12. 微pe工具箱 系统安装教程_微pe工具箱怎么装系统
  13. 2016年民营企业500强榜单(全国工商联发布)
  14. 举一个简单的例子,轻松搞懂所谓的“观察者模式”
  15. 8虚拟内存9页面置换算法
  16. Project build error: Non-resolvable parent POM
  17. 如何创建数仓指标体系?指标建模的基础理论
  18. python爬取某网站上的歌曲
  19. 基于EKF的锂离子电池SOC估计——Simulink建模仿真
  20. 美业门店拓客管理系统开发(PHP程序语言)

热门文章

  1. java 汉字转拼音缩写_汉字转拼音 java 工具类
  2. 桌面计算机没有了 怎么恢复,告诉你电脑桌面图标都没了怎么恢复
  3. 开源企业网盘选型(完善中)
  4. 网易运营微专业_数据驱动运营
  5. word里面插入的图片如何替换
  6. OJ每日一练——输出绝对值
  7. 如何包容青春期叛逆的孩子?
  8. 有人串口转wifi模块 httpd client通信示例-用户使用网页通过服务器收发串口数据源码 小黄人软件
  9. Spring Boot 入门教程 | 图文讲解
  10. 机器学习肝炎预测模型machine learning for hepatitis prediction model