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

L L*_*iet 7 linux debugging shell gdb

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

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

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

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

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

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

Tom*_*mey 10

有几种方法.

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

volatile int zzz;
...
int main() {
  while (!zzz) sleep (1);
Run Code Online (Sandbox Code Playgroud)

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

(gdb) set var zzz = 1
(gdb) cont
Run Code Online (Sandbox Code Playgroud)

一个稍微更新的("新的",如"它已经在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
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

(gdb) add-inferior -exec program-you-want-to-debug
Run Code Online (Sandbox Code Playgroud)

...然后切换到那个劣势并设置断点.现在切换回第一个劣势run- 它应该全部工作!