是否可以从调试的程序中控制gdb?我希望有一个可以帮助解决此问题的库,理想情况下使用gdb_sendcmd("bt")
之类的API,但我可以使用类似于通过套接字连接到本地gdb的东西。
主要用例是以编程方式添加数据断点,以监视下一个特定内存地址被修改的时间。目标语言自然是C;任何适用于它的东西都可以用C ++和Objective-C重用。
Answer from Employed Russian解决了我的直接问题,但我仍然想知道如何从调试程序中以编程方式运行GDB命令。如果我可以简单地将代码添加到项目中而不是为GDB编写额外的启动命令来创建带有附加命令的断点,它可能会加快调试速度。
因此,如果有一种以编程方式运行命令的方法,我仍然希望听到它;)
答案 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
所以观察点会自动附加。