从调试的程序向gdb发送命令

时间:2012-01-26 22:20:24

标签: c debugging gdb

是否可以从调试的程序中控制gdb?我希望有一个可以帮助解决此问题的库,理想情况下使用gdb_sendcmd("bt")之类的API,但我可以使用类似于通过套接字连接到本地gdb的东西。

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


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

因此,如果有一种以编程方式运行命令的方法,我仍然希望听到它;)

2 个答案:

答案 0 :(得分:2)

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处于中间状态,但很多东西都会按预期工作。

编辑:不用说,如果你的应用程序没有使用调试符号进行编译,这将无效!

答案 1 :(得分:1)

  

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

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

  

主要用例是以编程方式添加数据断点,以监视下一个特定内存地址何时被修改。

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

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

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

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

所以观察点会自动附加。