bdb
bdb - 调试器框架
源代码:
Lib / bdb.py
该bdb
模块处理基本的调试器功能,如设置断点或通过调试器管理执行。
以下例外被定义:
exception bdb.BdbQuit
Bdb
班级提出的用于退出调试器的异常。
该bdb
模块还定义了两个类:
class bdb.Breakpoint(self, file, line, temporary=0, cond=None, funcname=None)
该类实现临时断点,忽略计数,禁用和(重新)启用以及条件。
断点由数通过一个名为列表索引bpbynumber
和(file, line)
通过对bplist
。前者指向一个类的单个实例Breakpoint
。后者指向这种情况的列表,因为每行可能有多个断点。
创建断点时,其关联的文件名应为规范形式。如果定义了一个funcname
,当该函数的第一行被执行时,将会计算一个断点命中。一个条件断点总是计数一个命中。
Breakpoint
实例具有以下方法:
deleteMe()
从与文件/行关联的列表中删除断点。如果它是该位置的最后一个断点,它也会删除文件/行的条目。
enable()
将断点标记为已启用。
disable()
将断点标记为禁用。
pprint([out])
打印所有关于断点的信息:
- 断点编号。
- 如果它是暂时的或不是。
- 它的文件,行位置。
- 导致休息的条件。
- 如果它必须被忽略N次。
- 断点击数。
class bdb.Bdb(skip=None)
的Bdb
类作为一个通用的Python调试基类。
该课程负责跟踪设施的细节; 派生类应该实现用户交互。标准调试器类(pdb.Pdb
)是一个例子。
在跳跃
的说法,如果有,一定要全域式的模块名称模式的迭代。调试器不会进入与匹配其中一种模式的模块相关的帧。框架是否被认为起源于某个模块是由__name__
框架全局决定的。
2.7版本中的新功能:跳过
参数。
Bdb
通常不需要重写以下方法。
canonic(filename)
用于获取规范形式的文件名的辅助方法,即以规范化(不区分大小写的文件系统)绝对路径为例,删除周围的尖括号。
reset()
设置botframe
,stopframe
,returnframe
并quitting
用准备开始调试属性值。
trace_dispatch(frame, event, arg)
该功能作为调试帧的跟踪功能进行安装。它的返回值是新的跟踪函数(在大多数情况下,也就是它本身)。
默认实现决定如何分派帧,具体取决于即将执行的事件
类型(作为字符串传递)。事件
可以是以下之一:
"line"
:一行新的代码将被执行。
"call"
:函数即将被调用,或输入另一个代码块。
"return"
:函数或其他代码块即将返回。
"exception"
:发生异常。
"c_call"
:AC功能即将被调用。
"c_return"
:AC功能已返回。
"c_exception"
:AC函数引发了一个异常。
对于Python事件,调用专用函数(见下文)。对于C事件,不采取任何行动。
该ARG
参数取决于前面的事件。
有关sys.settrace()
跟踪功能的更多信息,请参阅文档。有关代码和框架对象的更多信息,请参阅标准类型层次结构。
dispatch_line(frame)
如果调试器应停在当前行上,则调用该user_line()
方法(应在子类中重写)。BdbQuit
如果Bdb.quitting
标志已设置(可以从中设置user_line()
),引发异常。trace_dispatch()
在该范围内返回对进一步跟踪的方法的引用。
dispatch_call(frame, arg)
如果调试器应停止此函数调用,请调用user_call()
方法(应在子类中重写)。BdbQuit
如果Bdb.quitting
标志已设置(可以从中设置user_call()
),引发异常。trace_dispatch()
在该范围内返回对进一步跟踪的方法的引用。
dispatch_return(frame, arg)
如果调试器应停止此函数返回,请调用该user_return()
方法(应在子类中重写)。BdbQuit
如果Bdb.quitting
标志已设置(可以从中设置user_return()
),引发异常。trace_dispatch()
在该范围内返回对进一步跟踪的方法的引用。
dispatch_exception(frame, arg)
如果调试器应该停止在这个异常处,调用user_exception()
方法(应该在子类中重写)。BdbQuit
如果Bdb.quitting
标志已设置(可以从中设置user_exception()
),引发异常。trace_dispatch()
在该范围内返回对进一步跟踪的方法的引用。
通常派生类不会覆盖以下方法,但如果他们想重新定义停止点和断点的定义,它们可能会出现。
stop_here(frame)
该方法检查框架
是否botframe
在调用堆栈的下方。botframe
是开始调试的框架
。
break_here(frame)
此方法检查文件名中是否存在断点以及属于帧的
行,或至少在当前函数中是否存在断点。如果断点是临时断点,则此方法将其删除。
break_anywhere(frame)
此方法检查当前帧的文件名中是否存在断点。
派生类应该重写这些方法来获得对调试器操作的控制权。
user_call(frame, argument_list)
从dispatch_call()
被调用函数内部任何地方有可能需要中断时调用此方法。
user_line(frame)
这种方法从dispatch_line()
任何一个stop_here()
或break_here()
收益时被调用True
。
user_return(frame, return_value)
这个方法dispatch_return()
在stop_here()
yield 时被调用True
。
user_exception(frame, exc_info)
这个方法dispatch_exception()
在stop_here()
yield 时被调用True
。
do_clear(arg)
处理临时断点时如何删除断点。
该方法必须由派生类实现。
派生类和客户端可以调用以下方法来影响步进状态。
set_step()
在一行代码后停止。
set_next(frame)
在给定帧中或下方的下一行停止。
set_return(frame)
从给定帧返回时停止。
set_until(frame)
当到达当前行的行不超过或从当前帧返回时停止。
set_trace([frame])
从框架
开始调试。如果未指定帧,
则调用从调用者的帧开始。
set_continue()
只在断点或完成时停止。如果没有断点,请将系统跟踪功能设置为None
。
set_quit()
将该quitting
属性设置为True
。这会BdbQuit
在下一次调用其中一种dispatch_*()
方法时引发。
派生类和客户端可以调用以下方法来操作断点。如果出现问题,或者None
一切正常,这些方法将返回一个包含错误消息的字符串。
set_break(filename, lineno, temporary=0, cond=None, funcname=None)
设置一个新的断点。如果lineno
行不存在作为参数传递的文件名
,则返回错误消息。的文件名
应为规范形式,如在所描述的canonic()
方法。
clear_break(filename, lineno)
删除文件名
和lineno中
的断点。如果没有设置,则返回错误消息。
clear_bpbynumber(arg)
删除具有索引断点精氨酸
的Breakpoint.bpbynumber
。如果arg
不是数字或超出范围,则返回错误消息。
clear_all_file_breaks(filename)
删除文件名中的
所有断点。如果没有设置,则返回错误消息。
clear_all_breaks()
删除所有现有的断点。
get_break(filename, lineno)
检查是否有一个断点LINENO
的文件名
。
get_breaks(filename, lineno)
返回所有断点LINENO
的文件名
,或一个空列表,如果没有设置。
get_file_breaks(filename)
返回文件名中的
所有断点,如果没有设置,则返回空列表。
get_all_breaks()
返回设置的所有断点。
派生类和客户端可以调用以下方法来获取表示堆栈跟踪的数据结构。
get_stack(f, t)
获取一个帧的记录列表,以及所有更高(呼叫)和更低帧的记录以及更高部分的大小。
format_stack_entry(frame_lineno[, lprefix=': '])
返回一个字符串,其中包含由(frame, lineno)
元组标识的关于堆栈条目的信息:
- 包含该帧的文件名的规范形式。
- 函数名称或"<lambda>"。
- 输入参数。
- 返回值。
- 代码行(如果存在)。
客户端可以调用以下两种方法来使用调试器来调试以字符串形式给出的语句。
run(cmd[, globals[, locals]])
调试通过语句执行的exec
语句。全局变量
默认为__main__.__dict__
,局部变量
默认为全局变量
。
runeval(expr[, globals[, locals]])
调试通过eval()
函数执行的表达式。全局
和当地人
具有相同的含义在run()
。
runctx(cmd, globals, locals)
为了向后兼容。调用run()
方法。
runcall(func, *args, **kwds)
调试一个函数调用,并返回其结果。
最后,模块定义了以下功能:
bdb.checkfuncname(b, frame)
检查我们是否应该在这里休息,这取决于断点b的
设置方式。
如果它是通过行号设置的,它将检查是否b.line
与也作为参数传递的帧中的一样。如果断点是通过函数名设置的,那么我们必须检查我们是否在正确的框架中(正确的功能),以及我们是否在第一个可执行行中。
bdb.effective(file, line, frame)
确定在这行代码中是否存在有效(有效)断点。返回断点的元组以及指示是否可以删除临时断点的布尔值。如果没有匹配的断点,则返回(None, None)
。
bdb.set_trace()
Bdb
从调用者的框架开始调试实例。