我想使用gdb调试程序。但我通过脚本调用该程序。
我如何使用gdb? 脚本很长,我无法使用gdb中的命令行参数直接调用程序。
此脚本启动时创建的进程也很短暂,因此无法将gdb附加到进程。
我想要做的是,用该程序启动gdb,然后添加我的断点 执行脚本(FYI - 它也接受参数),然后当它遇到断点时做任何我想做的事。
我查看了gdb中的shell选项,但是如果我没有错误会产生一个新shell,并在完成后返回gdb。这不是我想要的。
如果有更好的方法,请告诉我。
答案 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)
我过去使用的几种方法。
yourprog
重命名为yourprog.real
。制作一个名为yourprog
的脚本,该脚本运行gdb --args yourprog.real "$@"
。yourprog
在自己gdb
上调用pid
,然后循环调用sleep
。