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