我想使用gdb调试程序。 但是我通过脚本调用了该程序。
如何使用gdb?
该脚本很长,我无法使用gdb的命令行参数直接调用该程序。
另外,脚本启动时创建的进程是短暂的,因此无法将gdb附加到该进程。
我想要做的是,使用该程序启动gdb,然后添加断点
执行脚本(仅供参考-它也带有参数),然后在遇到断点时执行我想要的任何操作。
我查看了gdb中的shell选项,但是如果我没有记错的话,它将生成一个新的shell,并在完成后返回gdb。 这不是我想要的。
如果有更好的方法,请告诉我。
"该脚本很长,我无法使用gdb的命令行参数直接调用该程序。",您能在脚本中找到该程序吗?
无法在需要调试的程序所在的位置编辑脚本,然后将程序替换为" gdb program -ex" run"或类似内容?
我的脚本调用了另一个perl脚本,该脚本添加了很多参数,然后最终调用了原始二进制文件,我尝试了一下并成功了。谢谢@ dbrank0。 但是有没有办法从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 / bin / bash无法在Eclipse CDT中执行该应用程序?
我过去使用过几种方法。
将yourprog重命名为yourprog.real。制作一个名为yourprog的脚本,该脚本运行gdb --args yourprog.real"$@"。
使yourprog对其自身的pid调用gdb,然后在循环中调用sleep。
也许您可以为stackoverflow.com/questions/58318816/提供帮助?