属于Trepan系列的GDB-like Python调试器
项目描述
摘要
这是一个类似于gdb的Python调试器。它从头开始重写了pdb。
提供命令行界面(CLI)以及通过TCP/IP的远程访问接口。
请参阅教程了解如何使用。请参阅ipython-trepan了解如何在ipython或ipython笔记本中使用它。
此软件包适用于Python 2.6和2.7。有关与Python 3兼容的相同代码的修改版本,请参阅trepan3k。对于2.4之前的Python版本,请使用pydb。
功能
由于这个调试器与其他类似的调试器、trepanning 和一般的 gdb 相似,因此学习本调试器获得的知识可以转移到那些调试器,反之亦然。
这里有许多在标准Python调试器 pdb 中找不到的酷炫功能。
精确位置信息
Python以行为粒度报告行信息。为了获取更精确的信息,我们可以将字节码周围的字节码偏移量(例如你停止的地方)解析成Python的字节码。
据我所知,没有其他调试器能做这件事。
调试Python字节码(无源代码可用)
你可以将Python字节码的名称传递给调试器,很多时候调试器会愉快地继续进行。这个调试器非常努力地寻找源代码。要么使用当前的执行可搜索路径(例如 PATH),要么在某些情况下,通过在主代码对象(co_filename)中查找字节码内部的文件名,并使用考虑字节码所在目录的搜索路径来应用它。
如果通过这种方式找不到源代码,或者在源代码无法找到的其他情况下,调试器将反汇编字节码,并使用它来显示源代码测试。 这允许我们调试 `eval`’d 或 `exec’’d 的代码。
但如果你知道源代码的位置,你可以将文件源代码与字节码中当前列出的名称关联起来。有关详细信息,请参阅set_substitute 命令。
源代码语法着色
从版本0.2.0开始,终端源代码通过 pygments 进行着色。因此,你可以设置pygments颜色样式,例如“colorful”、“paraiso-dark”。有关详细信息,请参阅set_style。此外,我们在调试器输出和帮助文本中使用了终端粗体和强调文本。当然,你也可以关闭这些功能。从版本0.6.0开始,如果你有一个支持256色的终端,你可以使用自己的pygments_style。如果你的终端只支持基本的ANSI颜色序列,我们也在暗色和亮色主题中支持它。
命令补全
从版本2.8开始,添加了readline命令完成功能。命令完成不仅是一个简单的静态列表,而且根据上下文而变化。例如,对于接受可选数字的帧更改命令,列表中考虑的是有效的数字。
终端处理
我们可以根据您的终端行宽调整调试器输出。如果它发生变化,或者您想调整它,请参阅set_width。
智能求值
从版本0.2.0开始,如果您想在代码运行之前评估当前源代码行,请使用 eval 或 deval。要评估行的常见片段的文本,例如 if 语句的表达式部分,您可以使用 eval? 或 deval?。有关更多信息,请参阅eval。
更多步进控制
有时您需要小步骤,有时需要大步骤。
这个问题以几种方式处理
步进粒度
现在有 step 事件 和 next 事件 命令,有别名 s+、s> 等。以加号后缀的命令强制在下一次停止时执行不同的行,以减号后缀的命令则不执行。后缀 >、< 和 ! 分别指定 call、return 和 exception 事件。如果没有后缀,您将得到默认值;这是由 set different 命令设置的。
文档
文档:http://python2-trepan.readthedocs.org
事件过滤和跟踪
默认情况下,调试器在每次事件时都会停止:调用、返回、行、异常、C调用、C异常。如果您只想在行事件时停止(这在很大程度上是pdb的情况),您可以这样做。但是,如果您只想在调用和返回时停止,这也是可能的。或者选择某些组合。
结合默认处理所有事件,当停止时还会显示事件状态。停止的原因也可以通过info program查看。
调用和返回的事件跟踪
我不确定为什么之前没有这样做。可能是因为无法以不同的粒度设置和移动,跟踪调用和返回导致太多无趣的停止(例如在您刚刚停止的地方)。此外,在函数定义处停止可能也增加了这种繁琐。
因为我们真的在处理返回事件,所以我们可以显示返回值。(pdb有一个“非官方的”retval命令,似乎不起作用。)
通过Python Lambda表达式实现调试器宏
从0.2.3版本开始,有调试器宏。在gdb中,有一个扩展调试器命令的宏调试命令。
然而,Python有其自己的丰富编程语言,所以在这里重新创建gdb中的宏语言似乎很愚蠢。更简单、更强大的是使用Python。这里的调试器宏只是一个返回字符串或字符串列表的lambda表达式。每个返回的字符串应该是一个调试器命令。
我们还为极其简单的情况提供了别名,在这种情况下,您想为现有的调试器命令提供一个别名。但请注意:一些命令,如step,会检查命令后缀并相应地改变其行为。
我们还设想了多种其他方法来允许扩展此调试器,无论是通过额外的模块还是通过用户提供的调试器命令目录。
如果您在宏中寻找的是对调试器有更多前端控制,那么请考虑使用实验性(且未完成)的Bullwinkle协议。
字节码指令内省
我们在查看字节码方面做了更多工作,以提供更好的信息。通过这种方式,我们可以提供
一个跳过命令。它类似于跳转命令,但您不必处理行号。
代码片段的反汇编。现在,您可以根据您当前停止的栈帧进行反汇编。
更好地解释在execfile或exec内部您所在的位置。(但实际上这可能是Python编译器的一个错误特性。)
确保仅在有意义的地方设置断点。
更准确地确定您是否在定义函数的def语句中(因为调用指令包含MAKE_FUNCTION。)
即使没有上述的“反解析”,通过按行号范围或字节偏移范围反汇编的能力,让您确切地知道您在哪里以及代码正在运行。
某些调试器命令参数可以是变量和表达式
接受整数参数的命令,如frame-moving命令up,允许您使用一个Python表达式,该表达式可以包括本地或全局变量,并计算为整数。这消除了在gdb中需要特殊“美元”调试变量的需求。(但请注意,由于shlex解析,表达式不能包含嵌入的空格。)
进程外调试
现在,您可以在不同的进程甚至不同的计算机(位于不同的网络上)上调试您的程序!
Egg, Wheel, and Tarballs
可以通过常规的pip或easy_install进行安装。存在源tarball。有关如何安装的完整说明,请参阅安装说明,包括从git和其他方式安装。
模块化
调试器与其他跟踪钩子兼容。您可以有多个调试器对象。
以下列出的许多内容不会直接影响最终用户,但它最终会通过更健壮和功能丰富的代码产生影响。让开发者满意是一件好事。(商标)
命令和子命令现在是独立的类,而不是类中的方法。这意味着它们现在具有属性,例如它们可以在其中运行的上下文、最小缩写名或别名。要添加新命令,您基本上需要在目录中添加一个文件。
I/O是一个独立的层。这简化了通过TCP套接字读取命令的交互式readline行为。
接口是一个独立的层。本地调试、远程调试、从文件(源)运行调试器命令是不同的接口。这意味着,例如,如果我们能够给出更好的错误报告,如果调试器命令文件有错误。
有一个实验性的Python友好接口用于前端
更具可测试性。许多单元和功能测试。更多的pydb集成测试将最终添加。
另请参阅
trepan3k:Python 3的trepan调试器
pydbgr:调试器的先前版本
pydb:更旧的调试器版本(适用于非常旧的Python 2)
教程:如何使用教程
https://pypi.python.org/pypi/uncompyle6:Python反编译器
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。