首页 文章

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

提问于
浏览
5

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

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

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

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

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

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

2 回答

  • 8

    有几种方法 .

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

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

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

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

    稍微更新("new",如"it's been in gdb at least 10 years")方式是编辑脚本并在调用要调试的程序之前放置 gdb --args . 此方法除了其他方面外,还没有正确处理重定向 .

    最后,您可以使用多次调试 . 这是所有人的方法 . 在这里,我关注的主题是:#1475189_:

    $ 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 "$@" .

    • 使 yourprog 在其自己的 pid 上调用 gdb ,然后在循环中调用 sleep .

相关问题