我正在尝试找出一种方法来重复运行GDB 的可执行文件,并最好暂停错误。
我在手册中找不到办法做到这一点!
由于
答案 0 :(得分:14)
我试过(在Bash中):
while true ; do gdb -ex run a.out -ex quit ; done ;
不幸的是,事实证明这很难实现,但它确实自动运行了,当程序崩溃时(我用一个导致SIGABRT的旧程序测试),gdb问“程序正在运行。无论如何都要退出?(y或n)“,所以只需点击n。
答案 1 :(得分:6)
我遇到了同样的问题,并提出了我认为停止BoBTFish建议的无限循环的一种相当不错的方法。
您可以使用虚拟文件的存在来控制循环,而不是循环while true
,例如:
touch loopfile; while [ -f loopfile ] ; do gdb -ex run a.out -ex quit ; done ;
如果要停止无限调试会话,可以在同一目录中打开一个新终端rm loopfile
,也可以通过中断control-c
然后删除来退出同一终端loopfile
内的gdb
:
^CQuit
A debugging session is active.
Inferior 1 [process 11136] will be killed.
Quit anyway? (y or n) n
Not confirmed.
(gdb) shell rm loopfile
(gdb) quit
A debugging session is active.
Inferior 1 [process 11136] will be killed.
Quit anyway? (y or n) y
希望这对未来的某些人有用,它似乎是调试间歇性问题的好方法(如果是hackish)。
答案 2 :(得分:2)
使用shell脚本重新运行gdb
,并使用--batch -x <cmdfile>
选项gdb
指定一个只有run
字的命令文件来运行程序。所以像这样:
$ echo run > cmdfile ; while gdb --batch -x cmdfile myprogram ; do : ; done
答案 3 :(得分:1)
for i in {0..99}; do LD_LIBRARY_PATH=/some/path/to/libs gdb -ex 'set args arg1 arg2 arg3' -ex run ./execName -ex quit ; done
答案 4 :(得分:0)
一种简单的方法是在代码末尾放置一个断点,然后配置断点命令以再次运行程序。 例如,如果你的程序总是通过最后一条主线(假设没有突然退出)那么你可以:
(gdb) b <last line of main here>
(gdb) commands
> run [command line args]
> end
您可以直接按 CTRL-C 来停止执行。当然,GDB 会在发现分段错误或其他断点时停止执行,让您捕获错误。
对于大多数复杂的情况,您可以发挥您的想象力来寻找断点的好地方。例如,您可以在 exit() 函数上设置 bp。