26.2.个人数字广播
-Python调试器
源代码: 图书馆/pdb.py
模块个人数字广播
为Python定义交互式源代码调试器程序。它支持在以下位置设置(条件)断点和单步执行源代码行级别、堆栈框架检查、源代码列表,以及在任何堆栈帧的上下文中计算任意Python代码。它还可以支持事后调试,可以在程序控制下调用。
调试器是可扩展的-它实际上被定义为类私人数据库
.这是目前尚未记录的,但通过阅读源代码很容易理解。这个扩展接口使用模块bdb公司
和命令
.
调试器的提示是(分贝)
.运行受控程序的典型用法调试器的是:
>>>进口 个人数字广播
>>>进口 我的模块
>>>个人数字广播.运行(“mymodule.test()”)
><string>(0)?()
(Pdb)继续
><string>(1)?()
(Pdb)继续
名称错误:“垃圾邮件”
><string>(1)?()
(分贝)
pdb.py型
也可以作为脚本调用以调试其他脚本。对于例子:
当作为脚本调用时,如果满足以下条件,pdb将自动进入事后调试正在调试的程序异常退出。事后调试后(或正常退出程序后),pdb将重新启动程序。自动重新启动会保留pdb的状态(例如断点),在大多数情况下会更多比在程序退出时退出调试器有用。
从正在运行的程序中断到调试器的典型用法是插入
在您想要进入调试器的位置。然后你可以逐步完成此语句后面的代码,并在不使用调试器的情况下继续运行这个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=无)
私人数据库
是调试器类。
这个完整密钥,标准输入和标准输出参数传递给潜在的命令。命令
类别;请参阅那里的描述。
这个跳过参数(如果给定)必须是可迭代的全局样式模块名称模式。调试器不会单步进入源自模块的帧这与其中一种模式相匹配。
启用跟踪的示例调用跳过:
进口 个人数字广播; 个人数字广播.私人数据库(跳过=[“django.*”]).集合跟踪()
-
运行
(陈述[,全局变量[,当地人]])
-
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”命令不打印在断点处停止。对于断点,这可能是可取的即打印特定消息,然后继续。如果没有其他命令打印任何内容时,您看不到到达断点的迹象。
- s(步)
执行当前行,在第一次可能的情况下停止(在调用的函数或当前函数中的下一行)。
- n(分机)
继续执行,直到到达当前函数的下一行或返回。(两者之间的区别下一个
和步
是那个吗步
停止在被调用函数内,而下一个
在(接近)处执行调用的函数全速,仅在当前功能的下一行停止。)
- 计数(il)
继续执行,直到行号大于到达当前帧或从当前帧返回时。
- 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”的别名。
- q(单位)
退出调试器。正在执行的程序被中止。
脚注