如何在GDB脚本中执行目标程序

7
我想使用gdb调试一个程序,但是我是通过脚本来调用这个程序的。
我该如何使用gdb呢?由于脚本很长,所以我不能直接在gdb中使用命令行参数来调用程序。
此外,脚本启动时创建的进程生命很短,因此无法将gdb附加到进程上。
我的想法是,在程序和gdb一起启动后,添加断点,然后执行脚本(顺便提一下,脚本也带有参数),当它遇到断点时,就可以做任何我想做的事情了。
我看过gdb中的shell选项,但如果我没记错的话,这会生成一个新的shell并在完成后返回gdb。这不是我想要的。
如果有更好的方法,请告诉我。

脚本很长,我无法直接从gdb中使用命令行参数调用程序。你能在脚本中找到这个程序吗? - Nan Xiao
你不能编辑调用你想要调试的程序的脚本并将程序替换为"gdb program -ex "run<arguments>"或类似的内容吗? - dbrank0
我的脚本调用了另一个Perl脚本,它添加了一堆参数,最后调用了原始二进制文件。我尝试过了,它可以工作。谢谢@dbrank0。但是,难道没有一种方法可以从gdb中完成这个操作,而不是寻找和编辑脚本吗? - L Lawliet
2个回答

12

有几种方法。

真正老派的方法是将一个循环嵌入到你的程序的main中,类似于:

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

然后运行你的脚本。在另一个窗口中,对你想要调试的程序运行gdb,并使用attach命令附加到正在休眠的程序上。然后你就可以设置断点等等,最终完成:

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

一种稍微新一点的方法是修改你的脚本,在你想要调试的程序调用之前放置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

...然后切换到那个次优的选项并设置断点。现在切换回第一个次优的选项,run -- 一切都应该正常运行!


1

这是我过去使用的一些方法。

  1. yourprog 重命名为 yourprog.real。然后创建一个脚本,名为 yourprog,执行命令 gdb --args yourprog.real "$@"
  2. yourprog 自行调用 gdb,并在一个循环中调用 sleep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接