gdb如何从脚本执行目标程序

时间:2014-08-12 21:58:22

标签: linux shell debugging gdb

我想使用gdb调试程序。但我通过脚本调用该程序。

我如何使用gdb? 脚本很长,我无法使用gdb中的命令行参数直接调用程序。

此脚本启动时创建的进程也很短暂,因此无法将gdb附加到进程。

我想要做的是,用该程序启动gdb,然后添加我的断点 执行脚本(FYI - 它也接受参数),然后当它遇到断点时做任何我想做的事。

我查看了gdb中的shell选项,但是如果我没有错误会产生一个新shell,并在完成后返回gdb。这不是我想要的。

如果有更好的方法,请告诉我。

2 个答案:

答案 0 :(得分:9)

有几种方法。

真正老派的方式就是破解你的程序循环main,如:

volatile int zzz;
...
int main() {
  while (!zzz) sleep (1);

然后,运行您的脚本。在单独的窗口中,在要调试的程序上运行gdb,并使用attach附加到正在休眠的程序。然后你可以设置断点等,最后:

(gdb) set var zzz = 1
(gdb) cont

稍微更新一些("新"在"它已经在gdb中至少10年")方式是编辑你的脚本并放置{{1}在调用要调试的程序之前。但是,这种方法并不总是有效。除其他外,它不能正确处理重定向。

最后,您可以使用多次调试。这是"最新的"所有的方法。在这里,我关注了主题my own blog post

gdb --args

然后你可以做类似的事情:

$ gdb /bin/sh  # or whatever runs your script
(gdb) set args arguments-to-the-script
(gdb) set detach-on-fork off
(gdb) set target-async on
(gdb) set non-stop on
(gdb) set pagination off

...然后切换到那个劣势并设置断点。现在切换回第一个下级和(gdb) add-inferior -exec program-you-want-to-debug - 它应该全部工作!

答案 1 :(得分:1)

我过去使用的几种方法。

  1. yourprog重命名为yourprog.real。制作一个名为yourprog的脚本,该脚本运行gdb --args yourprog.real "$@"
  2. yourprog在自己gdb上调用pid,然后循环调用sleep
相关问题