除了使用命令行 tools/libraries(例如 python 中的 pexpect)之外,是否有更好的方法来控制 gdb?

Is there a better way to control gdb other than using command-line tools/libraries such as pexpect in python?

我正在尝试开发一个将 gdb 用于基本调试目的的程序。它从命令行执行 gdb,附加到目标进程并给出一些特定命令,然后读取 std 输出。一开始在纸面上看起来一切都很好,所以我开始使用 python 并期待。但是最近,在考虑未来的实现时,我遇到了一个问题。由于我一次只能从命令行执行一个命令(每个进程只能有一个 gdb 实例),不断请求数据刷新某些 UI 元素的线程最终会导致混乱。想想看:

1-)GDB停止程序执行命令
2-)在执行代码时阻塞其他线程
3-)GDB在执行完成后继续程序
4-)其中一个等待线程将立即尝试使用 GDB
5-) 转到 1 并重复

我们将要处理的进程每 0.5 秒就会冻结一次,这将是无法忍受的。

所以,我想实现的是在执行命令时多线程。我该怎么做?我考虑过使用 gdb 库,但由于我使用 python 并且这些代码是用 C 编写的,所以它在我的脑海中留下了一个关于兼容性的问号。

我找到了一个名为 python-ptrace 的库,它现在似乎可以正常工作(有一些我在使用 gdb 时从未遇到过的问题)。

编写 gdb 脚本的主要方法有两种。

一种方法是使用 gdb MI ("Machine Interface") 协议。这是 gdb 具有的专门用于编程用途的输入和输出模式。它有一些瑕疵但是 "usable enough" - 这是大多数 gdb GUI 使用的。

另一种方法是使用 gdb 的 Python API 在 gdb 中编写 运行 的 Python 脚本。这种方法通常更易于编程,但缺点是 Python API 缺少一些有用的部分,因此有时无法完成,具体取决于您要完成的目标。