linux - with - gdb教程




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

我曾经使用过几种方法。

  1. yourprog重命名为yourprog.real 。 创建一个名为yourprog的脚本,运行gdb --args yourprog.real "[email protected]"
  2. yourprog在自己的pid上调用gdb ,然后在循环中调用sleep

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

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

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

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

我查看了gdb中的shell选项,但是如果我没有错误,会产生一个新的shell,并在完成时返回到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 - 它应该都工作!





gdb