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

C 从调试的程序向gdb发送命令,c,debugging,gdb,C,Debugging,Gdb,是否可以从调试的程序控制gdb?我希望有一个库能对此有所帮助,最好是使用API,比如gdb_sendcmd(“bt”),但我可以通过套接字连接到本地gdb 主要用例是以编程方式添加数据断点,以便在下次修改某个内存地址时进行监视。目标语言自然是C语言;任何适用于它的都可以用C++和Objul-C.< 已经解决了我的直接问题,但我仍然想知道如何从调试的程序中以编程方式运行GDB命令。如果我可以简单地向项目中添加代码,而不是为GDB编写额外的启动命令,从而使用附加的命令创建断点,那么可能会加快一些调

是否可以从调试的程序控制gdb?我希望有一个库能对此有所帮助,最好是使用API,比如
gdb_sendcmd(“bt”)
,但我可以通过套接字连接到本地gdb

主要用例是以编程方式添加数据断点,以便在下次修改某个内存地址时进行监视。目标语言自然是C语言;任何适用于它的都可以用C++和Objul-C.<
已经解决了我的直接问题,但我仍然想知道如何从调试的程序中以编程方式运行GDB命令。如果我可以简单地向项目中添加代码,而不是为GDB编写额外的启动命令,从而使用附加的命令创建断点,那么可能会加快一些调试

因此,如果有一种以编程方式运行命令的方法,我还是很乐意听到;)

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

不可以。如果程序可以这样做,并且(比如)禁用了所有断点,您将如何调试它

主要用例是以编程方式添加数据断点,以便在下次修改某个内存地址时进行监视

这通常出现在这样的上下文中:在第n次调用
foo()
时,一个(本地或全局)变量
bar
意外地遭到重击,您希望找到罪魁祸首

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

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

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

因此,监视点会自动连接。

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");
}
我认为代码是直截了当的,但正如我在中所提到的,在
stop
回调中并非所有内容都是允许的,GDB处于中间状态,但许多事情都会按预期工作


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

我很确定这是不可能的。显然,你可以用Python为GDB编写一些脚本,但我不清楚如何自动调用它们,比如说,当遇到断点时,如何创建你想要的内存表。许多CPU体系结构都支持这种类型的硬件,包括数据断点、数据观察点、导致中断的指令,等等@TJD完全正确——但我想知道如何在gdb中以编程方式触发设置数据断点,或者如何运行任何其他命令。在开发过程中,允许程序驱动gdb(可能禁用断点)对我来说不是问题;插入了禁用断点的函数调用后,我还可以轻松地删除它。然而,您将命令附加到断点的想法听起来很有趣,解决了我的问题。我仍然很想知道是否有人知道如何以编程方式运行命令。我接受这个答案,尽管无法在OS X上实际运行。这可能是因为GDB的Xcode 4版本是6.3.5,而我看到您在另一个答案中提到了7.4。因此,Python可能不受支持:
.gdbinit:1:源代码命令文件中的错误:helper.py:3:源代码命令文件中的错误:未定义的命令:“导入”。请尝试“帮助”。
。不过,我确实明白发生了什么,这似乎正是我想要的。谢谢@Ivan oh yeah,6.3有点老了,2004年11月根据他们的网站,Python支持是在5年后推出的;)