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