26.2.个人数字广播-Python调试器

源代码: 图书馆/pdb.py


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

调试器是可扩展的-它实际上被定义为类私人数据库.这是目前尚未记录的,但通过阅读源代码很容易理解。这个扩展接口使用模块bdb公司命令.

调试器的提示是(分贝).运行受控程序的典型用法调试器的是:

>>>进口 个人数字广播
>>>进口 我的模块
>>>个人数字广播.运行(“mymodule.test()”)
><string>(0)?()
(Pdb)继续
><string>(1)?()
(Pdb)继续
名称错误:“垃圾邮件”
><string>(1)?()
(分贝)

pdb.py型也可以作为脚本调用以调试其他脚本。对于例子:

蟒蛇 - 个人数字广播 我的脚本.第页

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

2.4版中的新增功能:已添加重新启动事后行为。

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

进口 个人数字广播; 个人数字广播.集合跟踪()

在您想要进入调试器的位置。然后你可以逐步完成此语句后面的代码,并在不使用调试器的情况下继续运行这个c(c)命令。

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

>>>进口 个人数字广播
>>>进口 我的模块
>>>我的模块.测试()
追踪(最近一次通话):文件“<stdin>”,行1,英寸<模块>文件“./mymodule.py”,行4,英寸测试
    测试2()文件“./mymodule.py”,行,英寸测试2
    打印 垃圾邮件
命名错误:垃圾邮件
>>>个人数字广播.下午()
> ./mymodule.py(3)test2()
->打印垃圾邮件
(分贝)

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

pdb。运行(陈述[,全局变量[,当地人]])

执行陈述(以字符串形式给出)在调试器控制下。这个在执行任何代码之前出现调试器提示;您可以设置断点和类型持续,或者可以使用单步执行语句下一个(下面对所有这些命令进行了解释)。可选的全局变量当地人参数指定执行代码的环境;通过默认模块的字典__主要__使用。(请参阅解释执行官声明或评估()内置的功能。)

个人数字广播。runeval公司(表达[,全局变量[,当地人]])

评估表达(以字符串形式给出)在调试器控制下。什么时候?runeval()返回,则返回表达式的值。否则函数类似于运行().

个人数字广播。运行调用(功能[,论点,。。。])

致电功能(函数或方法对象,而不是字符串)论点。什么时候?运行调用()返回,它返回任何函数调用返回。输入函数后,调试器提示即会出现。

pdb。集合跟踪()

在调用堆栈帧处输入调试器。这对于硬编码在程序中的给定点处设置断点,即使代码不是这样正在调试(例如,当断言失败时)。

个人数字广播。运动后([追溯])

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

个人数字广播。下午()

输入中找到的回溯的事后调试sys.last_traceback系统.

这个运行*功能和设置跟踪()是用于实例化私人数据库类并调用同名的方法。如果你想访问更多功能,您必须自己完成:

个人数字广播。私人数据库(completekey='tab',stdin=无,标准输出=无,skip=无)

私人数据库是调试器类。

这个完整密钥,标准输入标准输出参数传递给潜在的命令。命令类别;请参阅那里的描述。

这个跳过参数(如果给定)必须是可迭代的全局样式模块名称模式。调试器不会单步进入源自模块的帧这与其中一种模式相匹配。1

启用跟踪的示例调用跳过:

进口 个人数字广播; 个人数字广播.私人数据库(跳过=[“django.*”]).集合跟踪()

2.7版中的新增功能:这个跳过参数。

运行(陈述[,全局变量[,当地人]])
runeval公司(表达[,全局变量[,当地人]])
运行调用(功能[,论点,。。。])
集合跟踪()

请参阅上述功能的文档。

26.3。调试器命令

调试器识别以下命令。大多数命令可以是缩写为一个或两个字母;例如h(elp)(小时)意味着要么小时帮助可以用于输入帮助命令(但不能帮助,也不是H(H)帮助帮助). 命令的参数必须用分隔空白(空格或制表符)。可选参数括在方括号中([])在命令语法中;方括号不能打出来。命令语法中的替代项由竖线分隔(|).

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

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

可以在一行中输入多个命令,以;;.(A单一的;未使用,因为它是一行中多个命令的分隔符传递给Python解析器。)没有情报用于分离命令;输入首先被拆分;;一对,即使它在引用字符串的中间。

调试器支持别名。别名可以具有允许一个对所审查的上下文具有一定程度的适应性。

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

h(elp)(小时)[命令]

不带参数,打印可用命令列表。用一个命令作为参数,打印有关该命令的帮助。帮助 个人数字广播显示完整文档文件;如果环境变量PAGER公司定义,则文件通过管道传输到该命令。自从命令参数必须是标识符,帮助 执行官必须输入才能获得有关的帮助!命令。

w(此处)

打印堆栈跟踪,最新的帧位于底部。一支箭指示确定大多数命令上下文的当前帧。

d(自有)

将当前帧在堆栈跟踪中下移一级(到较新的帧)。

u(p)

在堆栈跟踪中将当前帧上移一级(移到较旧的帧)。

b(断裂)[[文件名:]线路号|功能[,条件]]

用一个行号参数,在当前文件中设置一个中断。用一个功能参数,在其中的第一个可执行语句处设置中断功能。行号的前缀可以是文件名和冒号在另一个文件中指定断点(可能是尚未加载的文件)。搜索文件搜索路径。请注意,每个断点都被分配了一个所有其他断点命令引用的编号。

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

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

t断裂[[文件名:]行号|功能[,条件]]

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

cl(耳)[文件名:lineno|业务流程编号[bpnumber(bpnumber)…]]

用一个文件名:lineno参数,清除此行的所有断点。使用以空格分隔的断点编号列表,清除这些断点。无需争论,清除所有中断(但首先要求确认)。

禁用[业务流程编号[bpnumber(bpnumber)…]]

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

启用[业务流程编号[bpnumber(bpnumber)…]]

启用指定的断点。

忽视业务流程编号[计数]

设置给定断点编号的忽略计数。如果省略计数,则忽略计数设置为0。当忽略计数为零。当非零时,每次断点为到达,断点未被禁用,以及任何相关条件评估为true。

条件业务流程编号[条件]

条件是一个表达式,在断点为荣幸的。如果没有条件,则删除任何现有条件;断点是无条件的。

命令[业务流程编号]

指定断点号的命令列表业务流程编号.命令它们出现在下面的行中。键入仅包含“end”的行终止命令。例如:

(私人数据库) 命令 1
(通用域名格式) 打印 一些变量
(通用域名格式) 结束
(私人数据库)

要从断点中删除所有命令,请键入命令并跟随它立即结束;也就是说,不要发出命令。

没有业务流程编号参数,命令引用最后一个断点集。

您可以使用断点命令再次启动程序。只需使用continue命令、步骤或任何其他恢复执行的命令。

指定恢复执行的任何命令(当前为continue、步骤、next、,return、jump、quit及其缩写)终止命令列表(好像命令后紧接着是end)。这是因为你随时都可以恢复执行(即使有一个简单的下一步或步骤),您可能会遇到另一个断点-它可能有自己的命令列表,导致有关要执行的列表。

如果使用命令列表中的“silent”命令不打印在断点处停止。对于断点,这可能是可取的即打印特定消息,然后继续。如果没有其他命令打印任何内容时,您看不到到达断点的迹象。

2.5版新增。

s(步)

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

n(分机)

继续执行,直到到达当前函数的下一行或返回。(两者之间的区别下一个是那个吗停止在被调用函数内,而下一个在(接近)处执行调用的函数全速,仅在当前功能的下一行停止。)

计数(il)

继续执行,直到行号大于到达当前帧或从当前帧返回时。

2.6版中的新增功能。

r(返回)

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

c(ont(inue))

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

j(泵)行号

设置将要执行的下一行。仅在底部可用框架。这允许您向后跳转并再次执行代码,或向前跳转以跳过您不想运行的代码。

应该注意的是,并不是所有的跳转都被允许,例如,不允许跳转可以跳到中间对于循环或退出最后条款。

l(列表)[第一[,最后的]]

列出当前文件的源代码。不带参数,列出11行左右当前行或继续上一个列表。有一个参数,列表11在那条线上绕线。用两个参数列出给定范围;如果第二个参数小于第一个参数,它被解释为计数。

a(rgs)

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

表达

评估表达并打印其值。

注释

打印也可以使用,但不是调试器命令-这将执行蟒蛇打印声明。

聚丙烯表达

就像命令,但表达式的值打印得很漂亮使用打印模块。

别名[名称[命令]]

创建一个名为名称执行的命令。命令必须用引号括起来。可替换参数可以通过以下方式表示%1,%2个,依此类推,而%*被所有参数替换。如果没有命令,则为名称如图所示。如果没有参数给定,将列出所有别名。

别名可以是嵌套的,可以包含任何可以在pdb提示。注意,内部pdb命令可以被别名覆盖。这样的命令将一直隐藏,直到删除别名。别名是递归应用于命令行的第一个单词;所有其他单词这条线是单独留下的。

例如,下面是两个有用的别名(尤其是当放置在.pdbrc文件文件):

#打印实例变量(使用“pi classInst”)
别名 圆周率 对于 k个 在里面 %1__字典__.钥匙(): 打印 "%1.",k个,"=",%1__字典__[k个]
#在self中打印实例变量
别名  圆周率 自己
尤尼亚斯名称

删除指定的别名。

[!]陈述

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

(私人数据库) 全球的 列表选项(_O); 列表选项(_O) = [“-l”]
(私人数据库)
运行[参数…]

重新启动已调试的Python程序。如果提供了一个参数,则将其拆分使用“shlex”,结果用作新的sys.argv。历史、断点、,操作和调试器选项被保留。“restart”是“run”的别名。

2.6版中的新增功能。

q(单位)

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

脚注

1

帧是否被视为源自某个模块__姓名__在全球框架内。