跳转到主要内容

属于Trepan系列的GDB-like Python调试器

项目描述

Travis Build status Pypi Installs License

摘要

这是一个类似于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开始,如果您想在代码运行之前评估当前源代码行,请使用 evaldeval。要评估行的常见片段的文本,例如 if 语句的表达式部分,您可以使用 eval?deval?。有关更多信息,请参阅eval

更多步进控制

有时您需要小步骤,有时需要大步骤。

这个问题以几种方式处理

步进粒度

现在有 step 事件next 事件 命令,有别名 s+s> 等。以加号后缀的命令强制在下一次停止时执行不同的行,以减号后缀的命令则不执行。后缀 ><! 分别指定 callreturnexception 事件。如果没有后缀,您将得到默认值;这是由 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

可以通过常规的pipeasy_install进行安装。存在源tarball。有关如何安装的完整说明,请参阅安装说明,包括从git和其他方式安装。

模块化

调试器与其他跟踪钩子兼容。您可以有多个调试器对象。

以下列出的许多内容不会直接影响最终用户,但它最终会通过更健壮和功能丰富的代码产生影响。让开发者满意是一件好事。(商标)

  • 命令和子命令现在是独立的类,而不是类中的方法。这意味着它们现在具有属性,例如它们可以在其中运行的上下文、最小缩写名或别名。要添加新命令,您基本上需要在目录中添加一个文件。

  • I/O是一个独立的层。这简化了通过TCP套接字读取命令的交互式readline行为。

  • 接口是一个独立的层。本地调试、远程调试、从文件()运行调试器命令是不同的接口。这意味着,例如,如果我们能够给出更好的错误报告,如果调试器命令文件有错误。

  • 有一个实验性的Python友好接口用于前端

  • 更具可测试性。许多单元和功能测试。更多的pydb集成测试将最终添加。

另请参阅

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

trepan2-1.2.9.tar.gz (282.3 KB 查看哈希值

上传时间

构建分发

trepan2-1.2.9-py2-none-any.whl (346.4 KB 查看哈希值

上传时间 Python 2

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面