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

我想用gdbdebugging一个程序。 但是我通过一个脚本来调用这个程序。

我怎样才能使用gdb? 脚本很长,我不能直接使用gdb的命令行参数来调用程序。

此外,脚本启动时创build的进程是短暂的,所以不能将gdb附加到进程。

我想要做的是类似的,用该程序启动gdb,添加我的断点,然后执行脚本(仅供参考 – 它也需要参数),然后当它打断点时做任何我想要的。

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

请让我知道如果有更好的方法。

Solutions Collecting From Web of "gdb如何从脚本执行目标程序"

有几种方法。

真正的老派方法是把你的程序的main打成一个循环:

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

然后,运行你的脚本。 在另一个窗口中,对要调试的程序运行gdb,并使用attach附加到睡眠程序。 然后你可以设置断点等,最后:

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

稍微更新一点(在“gdb中至少有10年”的新增功能)就是编辑你的脚本,并在调试你要调试的程序之前加上一个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. yourprog重命名为yourprog.real 。 创建一个名为yourprog的脚本,运行gdb --args yourprog.real "$@"
  2. yourprog在自己的pid上调用gdb ,然后在循环中调用sleep