bdb调试器框架

源代码: Lib / bdb.py


bdb模块处理基本的调试器函数,比如设置断点或通过调试器管理执行.

定义了以下异常:

exception bdb.BdbQuit

Bdb类为退出调试器而提出的异常.

bdb模块也定义了两个类:

class bdb.Breakpointself, file, line, temporary=0, cond=None, funcname=None

这个类实现临时断点,忽略计数,禁用和(重新)启用,以及条件.

断点通过一个名为bpbynumber的列表和(file, line)通过bplist对的索引编号。前者指的是类Breakpoint的单个实例。后者指向这样的实例列表,因为每行可能有多个断点.

创建断点时,其关联的文件名应该是canonicalform。如果定义了funcname,则在执行该函数的第一行时将计算断点命中。一个条件断点总是命中一个点击

Breakpoint实例有以下方法:

deleteMe

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

enable ( )

将断点标记为已启用.

disable()

将断点标记为已禁用.

bpformat ()

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

  • 断点号码
  • 如果它是暂时的还是
  • 它是档案,线位置
  • 导致休息的条件
  • 如果它在接下来的N次中必须忽略.
  • 断点击中次数

版本3.2.

bpprint(out=None)

的新内容将bpformat()的输出打印到文件out,或者如果是None,标准输出.

class bdb.Bdb (skip=None

Bdbclass充当通用的Python调试器基类.

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

// skip如果给定参数,则必须是glob-stylemodule名称模式的可迭代参数。调试器不会进入与匹配其中一种模式的模块中的框架。是否认为框架起源于某个模块是由__name__在框架全局中

//新版本3.1: skip论证

以下方法Bdb通常不要需要被覆盖.

canonic (filename )

以规范形式获取文件名的辅助方法,即asase-normalized(在不区分大小写的文件系统上)绝对路径,剥离周围的尖括号.

reset (

设置botframe, stopframe, returnframequitting属性,并准备开始调试值

trace_dispatch// (frame, event, arg

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

默认实现决定如何调度帧,具体取决于即将执行的事件类型(作为字符串传递).event可以是以下之一:

  • "line":将执行一行新代码.
  • "call":即将调用一个函数,或者另一个代码阻塞.
  • "return":函数或其他代码块即将返回。
  • "exception":发生异常.
  • "c_call":即将调用AC功能.
  • "c_return":AC功能已经返回.
  • "c_exception":AC功能异常.

对于Python事件,调用专用函数(见下文)。在C事件中,没有采取任何行动.

arg参数取决于之前的事件.

请参阅sys.settrace()有关thetrace功能的更多信息。有关代码和框架对象的更多信息,请参阅标准类型层次结构.

dispatch_lineframe

如果调试器应该在当前行停止,则调用user_line()方法(应该在子类中重写)。如果设置了BdbQuit标志,则调出Bdb.quitting异常(可以从user_line())。返回对trace_dispatch()方法的引用,以便在该范围内进一步跟踪.

dispatch_call (frame, arg)

如果调试器应停止此函数调用,请调用该user_call()方法(应该在子类中重写).Raise a BdbQuit如果Bdb.quitting标志设置(可以从设置user_call())。返回对的引用trace_dispatch()在该范围内进一步追踪的方法.

dispatch_returnframe, arg

如果调试器应在此函数返回时停止,则调用user_return()方法(应该在子类中重写).Raise a BdbQuit设置Bdb.quitting标志的异常(可以从user_return()设置)。返回对trace_dispatch()方法的引用,以便在该范围内进一步跟踪.

dispatch_exception (frame, arg )

如果调试器应该在此异常处停止,则调用user_exception()方法(应该在子类中重写).Raise a BdbQuit如果Bdb.quitting标志设置(可以从设置user_exception())。返回对trace_dispatch()方法的引用,以便在该范围内进一步跟踪.

通常派生类不会覆盖以下方法,但如果他们想要重新定义停止和断点的定义,它们可能会重新定义.

stop_hereframe

这个方法检查frame在调用堆栈之下的某个地方botframebotframe是调试开始的框架.

break_here (frame)

这个方法检查文件名和行中是否有断点属于frame或者至少在当前的功能中。如果断点是临时断点,则此方法将其删除.

break_anywhere (frame )

此方法检查当前帧的文件名中是否存在断点.

Derived类应覆盖这些方法以控制debuggeroperation.

user_call(frame, argument_list)

从调用此方法dispatch_call()当有可能在被叫功能内的任何地方都需要休息时

user_lineframe

从调用此方法dispatch_line()何时stop_here()break_here()产生True.

user_returnframe, return_value

这个方法从dispatch_return()调用时stop_here()产生True.

user_exceptionframe, exc_info

这个方法从dispatch_exception()调用时stop_here()产生True.

do_cleararg

处理断点如何在临时断点时必须删除.

这个方法必须由派生类实现.

派生类和客户端可以调用以下方法来影响步进状态.

set_step

一行代码后停止

set_nextframe

停在给定框架内或下方的下一行.

set_return(frame)

从给定框架返回时停止.

set_untilframe

当线路不大于当前线路时或从当前帧返回时停止.

set_trace ( [frame])

frame开始调试。如果frame没有指定,调试从调用者的框架开始.

set_continue

仅在断点处或完成时停止。如果没有断点,请将系统跟踪功能设置为None.

set_quit

设置quitting属于True。这引起了BdbQuit在接下来打电话给dispatch_*()方法。

派生类和客户端可以调用以下方法来操作断点。如果出现问题,这些方法会返回一个包含错误信息的字符串,如果一切正常,则返回None.

set_break(filename, lineno, temporary=0, cond, funcname

设置一个新的断点。如果lineno作为参数传递filename不存在,则返回错误消息。filename应该是规范形式,如canonic()方法所述

clear_breakfilename, lineno

删除filenamelineno。如果没有设置,则返回错误消息.

clear_bpbynumberarg

删除索引为arg在里面Breakpoint.bpbynumber。如果arg不是数字或超出范围,返回错误信息.

clear_all_file_breaks(filename)

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

clear_all_breaks ()

删除所有现有断点.

get_bpbynumber (arg)

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

新版本3.2.

get_break (filename, lineno

检查lineno是否有断点filename.

get_breaksfilename, lineno

lineno中返回filename的所有断点,如果没有设置,则返回空列表.

get_file_breaks (filename

返回filename中的所有断点,如果没有设置则返回空列表

get_all_breaks// ()

返回所有设置的断点.

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

get_stack (f, t

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

format_stack_entry (frame_lineno, lprefix=”: “)

返回一个包含信息的字符串关于堆栈条目,由(frame, lineno)tuple:

  • 包含框架的文件名的规范形式.
  • 函数名称,或"<lambda>".
  • 输入参数.
  • 返回值。
  • 代码行(如果存在).

客户端可以调用以下两种方法来使用调试器来调试声明,以字符串形式给出

runcmd, globals=None, locals=None

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

runevalexpr, globals=None, locals=None

调试通过eval()函数执行的表达式。globalslocals的含义与run().

runctxcmd, globals, locals

为了向后兼容。调用run()方法

runcall//(func, *args, **kwds)

调试一个函数调用,并返回其结果.

最后,模块定义了以下功能:

bdb.checkfuncnameb, frame

检查是否应该在这里打破,取决于断点b设置的方式

如果它是通过行号设置的,它会检查是否b.line与作为参数传递的帧中的一个相同。如果断点是通过functionname设置的,我们必须检查我们是否在右边框架(右边的函数),如果它们在第一个可执行行中.

bdb.effectivefile, line, frame

确定此代码行是否存在有效(活动)断点。返回断点的元组和一个布尔值,指示是否可以删除临时断点。返回(None, None)如果有不匹配的断点

bdb.set_trace// ()

用来自呼叫者框架的Bdb开始调试