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 . 后者指向此类实例的列表,因为每行可能有多个断点。

创建断点时,其关联的文件名应为规范格式。如果A 函数名 如果定义了,则在执行该函数的第一行时将计算断点命中。条件断点总是计算命中次数。

Breakpoint 实例具有以下方法:

deleteMe()

从与文件/行关联的列表中删除断点。如果它是该位置上的最后一个断点,它还将删除文件/行的条目。

enable()

将断点标记为已启用。

disable()

将断点标记为禁用。

bpformat()

返回一个字符串,其中包含有关断点的所有信息,格式良好:

  • 断点编号。

  • 是否是临时的。

  • 它的文件,行位置。

  • 导致中断的情况。

  • 如果必须在接下来的n次中忽略它。

  • 断点命中计数。

3.2 新版功能.

bpprint(out=None)

打印的输出 bpformat() 文件 out ,或者如果是 None ,到标准输出。

class bdb.Bdb(skip=None)

这个 Bdb 类充当通用的Python调试器基类。

这个类负责跟踪工具的细节;派生类应该实现用户交互。标准调试器类 (pdb.Pdb )就是一个例子。

这个 skip 参数(如果给定)必须是全局样式模块名称模式的iterable。调试器不会单步进入源自与这些模式之一匹配的模块的帧中。帧是否被视为源自某个模块,由 __name__ 在帧全局中。

3.1 新版功能: 这个 skip 参数。

以下方法 Bdb 通常不需要重写。

canonic(filename)

以规范形式获取文件名的辅助方法,即,作为大小写规范化(在不区分大小写的文件系统上)的绝对路径,去掉周围的尖括号。

reset()

设置 botframestopframereturnframequitting 具有值的属性已准备好开始调试。

trace_dispatch(frame, event, arg)

此函数作为调试帧的跟踪函数安装。它的返回值是新的跟踪函数(在大多数情况下,就是它本身)。

默认实现根据即将执行的事件类型(作为字符串传递)决定如何分派帧。 事件 可以是以下之一:

  • "line" :将执行新的代码行。

  • "call" :一个函数即将被调用,或输入另一个代码块。

  • "return" :函数或其他代码块即将返回。

  • "exception" :发生异常。

  • "c_call" :即将调用C函数。

  • "c_return" :C函数已返回。

  • "c_exception" :C函数引发了异常。

对于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() 产量 True .

user_exception(frame, exc_info)

此方法是从 dispatch_exception() 什么时候? stop_here() 产量 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, funcname)

设置新断点。如果 林诺 行不存在 filename 作为参数传递,返回错误消息。这个 filename 应采用规范形式,如 canonic() 方法。

clear_break(filename, lineno)

删除中的断点 filename林诺 . 如果未设置,则返回错误消息。

clear_bpbynumber(arg)

删除具有索引的断点 argBreakpoint.bpbynumber . 如果 arg 不是数字或超出范围,返回错误消息。

clear_all_file_breaks(filename)

删除中的所有断点 filename . 如果未设置,则返回错误消息。

clear_all_breaks()

删除所有现有断点。

get_bpbynumber(arg)

返回由给定数字指定的断点。如果 arg 是字符串,它将转换为数字。如果 arg 是非数字字符串,如果给定断点从未存在或已被删除,则为 ValueError 提高了。

3.2 新版功能.

get_break(filename, lineno)

检查是否存在断点 林诺 属于 filename .

get_breaks(filename, lineno)

返回的所有断点 林诺 在里面 filename 或空列表(如果未设置)。

get_file_breaks(filename)

返回中的所有断点 filename 或空列表(如果未设置)。

get_all_breaks()

返回设置的所有断点。

派生类和客户端可以调用以下方法来获取表示堆栈跟踪的数据结构。

get_stack(f, t)

获取一个帧和所有较高(调用)和较低帧的记录列表,以及较高部分的大小。

format_stack_entry(frame_lineno, lprefix=': ')

返回一个字符串,其中包含有关堆栈项的信息,由 (frame, lineno) 元组:

  • 包含框架的文件名的规范形式。

  • 函数名,或 "<lambda>" .

  • 输入参数。

  • 返回值。

  • 代码行(如果存在)。

客户端可以调用以下两个方法来使用调试器调试 statement ,作为字符串提供。

run(cmd, globals=None, locals=None)

调试通过 exec() 功能。 globals 默认为 __main__.__dict__locals 默认为 globals .

runeval(expr, globals=None, locals=None)

调试通过 eval() 功能。 globalslocals 与中的含义相同 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 来自调用方帧的实例。