【问题标题】:Sending commands to gdb from the debugged program从调试程序向 gdb 发送命令
【发布时间】:2012-02-20 00:40:31
【问题描述】:

是否可以通过调试程序控制 gdb?我希望有一个可以帮助解决这个问题的库,最好是使用gdb_sendcmd("bt") 之类的 API,但我可以忍受通过套接字连接到本地 gdb 之类的东西。

主要用例是以编程方式添加数据断点来监控下一次修改某个内存地址的时间。目标语言自然是 C;任何适用于它的东西都可以在 C++ 和 Objective-C 中重用。


Answer from Employed Russian 解决了我的直接问题,但我仍然很想知道如何从调试程序中以编程方式运行 GDB 命令。如果我可以简单地将代码添加到项目中,而不是为 GDB 编写额外的启动命令,这些命令会创建带有附加命令的断点,它可能会加快一些调试速度。

所以,如果有办法以编程方式运行命令,我仍然很乐意听到它;)

【问题讨论】:

  • 我很确定这不可能。显然,您可以在 Python 中为 GDB 编写一些脚本,但是我不清楚如何自动调用它们,例如,当断点被命中时,以创建您要求的内存监视。
  • 许多 CPU 架构都通过数据断点、数据观察点、导致中断的指令等对此类事物提供硬件支持。
  • @TJD 没错——但我想知道如何在 gdb 中以编程方式触发设置数据断点,或者如何运行任何其他命令。

标签: c debugging gdb


【解决方案1】:

GDB 导出的 Python 接口可以让你做很多事情。也许这样的东西会满足您的要求:

import gdb

CMD_FCT  = "gdb_run" 
CMD_NAME = "str"

class GdbRunBreakpoint(gdb.Breakpoint):
    def __init__(self):
        gdb.Breakpoint.__init__(self, CMD_FCT, internal=1)
        self.silent = True

    def stop(self):
        cmd = gdb.parse_and_eval(CMD_NAME).string()
        gdb.execute(cmd)
        return False
GdbRunBreakpoint()

(只是写在一个文件中,并从你的.gdbinit文件中获取)

在应用程序方面:

void gdb_run(char *str) {}


int main () {
    gdb_run("where");
}

我认为代码是直截了当的,但正如我在https://stackoverflow.com/a/8884512/341106 中提到的,stop 回调中并非所有内容都允许,GDB 处于中间状态,但许多事情都会按预期工作。

编辑:不用说,如果您的应用没有使用调试符号编译,这将不起作用!

【讨论】:

  • 我接受了答案,尽管实际上无法让它在 OS X 上运行。这可能是由于 Xcode 4 的 GDB 为 6.3.5,而我看到你在中提到 7.4你的另一个答案。因此,Python 可能不受支持:.gdbinit:1: Error in sourced command file:<newline>helper.py:3: Error in sourced command file:<newline>Undefined command: "import". Try "help".。不过,我确实明白发生了什么,而且这似乎正是我想要的。谢谢!
  • @Ivan 哦,是的,6.3 有点旧,根据他们的网站,2004 年 11 月,Python 支持是在 5 年后推出的;)
【解决方案2】:

是否可以从被调试的程序中控制gdb?

没有。如果程序可以做到这一点,并且(比如说)禁用所有断点,你会如何调试它?

主要用例是以编程方式添加数据断点以监控下一次修改某个内存地址的时间。

这经常出现在这样的上下文中:在第 N 次调用 foo() 时,一个(本地或全局)变量 bar 被意外破坏,而您想要找出罪魁祸首。

如果这确实是您的问题,那么在您知道bar 的值仍然不错的行上设置一个断点(就在它被初始化之后)。将该断点上的忽略计数(使用ignore 命令)设置为N-1,然后,当断点被命中时,在bar 上设置观察点。

您甚至可以将命令附加到断点:

commands 1   # assuming this was the first breakpoint
 watch bar
 continue
end

所以观察点会自动附加。

【讨论】:

  • 程序被允许驱动 gdb(并且可能禁用断点)在开发过程中对我来说不是问题;插入禁用断点的函数调用后,我也可以轻松删除它。 但是,您将命令附加到断点的想法听起来很有趣,并且解决了我的问题。我仍然很想看看是否有人知道如何以编程方式运行命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 2011-04-17
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
相关资源
最近更新 更多