【问题标题】:gdb how to execute target program from scriptgdb如何从脚本执行目标程序
【发布时间】:2014-10-06 03:20:43
【问题描述】:

我想调试一个程序,使用 gdb。但我通过脚本调用该程序。

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

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

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

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

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

【问题讨论】:

  • “脚本很长,我无法直接使用gdb的命令行参数调用程序。”,你能在脚本中找到程序吗?
  • 你不能编辑调用你要调试的程序的脚本,并用“gdb program -ex”run ”或类似的东西替换程序吗?
  • 我的脚本调用了另一个 perl 脚本,该脚本添加了一堆参数,然后最后调用了原始二进制文件,我试了一下,它成功了。谢谢@dbrank0。但是有没有办法从 gdb 中执行此操作而不是搜索和编辑脚本?

标签: linux shell debugging gdb


【解决方案1】:

我过去使用过的几种方法。

  1. yourprog 重命名为yourprog.real。制作一个名为 yourprog 的脚本,该脚本运行 gdb --args yourprog.real "$@"
  2. yourprog 自己调用gdb pid,然后循环调用sleep

【讨论】:

【解决方案2】:

有几种方法。

真正老派的方法是在程序的main 中加入一个循环,例如:

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

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

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

一种稍新的(“新”,如“它在 gdb 中至少存在 10 年”)的方式是编辑您的脚本并在调用您要调试的程序之前放置一个 gdb --args。但是,这种方法并不总是有效。除其他外,它不能正确处理重定向。

最后,您可以使用多劣质调试。这是所有方法中的“最新”方法。在这里我关注my own blog post的话题:

$ 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 - 它应该都可以工作!

猜你喜欢
  • 1970-01-01
  • 2018-06-06
  • 2016-03-15
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 2014-07-20
  • 1970-01-01
相关资源
最近更新 更多