我试图找出一种方法来重复运行 GDB 的可执行文件,最好在错误时停止。
我在手册中找不到这样做的方法!
谢谢
我试过(在 Bash 中):
while true ; do gdb -ex run a.out -ex quit ; done ;
不幸的是,这被证明是相当棘手的,但它确实自动运行,当程序崩溃时(我用一个导致 SIGABRT 的旧程序进行测试),gdb 询问“程序正在运行。无论如何退出?(y或 n)",所以只需按 n。
我遇到了同样的问题,并想出了一个我认为是停止 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
希望这对将来的某些人有用,这似乎是调试间歇性问题的一种不错的(如果是骇人听闻的)方法。
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
使用 shell 脚本重复运行gdb
,并使用--batch -x <cmdfile>
选项gdb
指定一个命令文件,该文件只包含run
运行程序的单词。所以是这样的:
$ echo run > cmdfile ; while gdb --batch -x cmdfile myprogram ; do : ; done
一种简单的方法是在代码末尾放置一个断点,并配置断点命令以再次运行程序。例如,如果您的程序总是通过最后一条主线(假设没有突然退出),那么您可以:
(gdb) b <last line of main here>
(gdb) commands
> run [command line args]
> end
您可能只是 CTRL-C 停止执行。当然,如果 GDB 发现分段错误或另一个断点,GDB 将停止执行,从而允许您捕获错误。
对于大多数复杂的情况,您可以发挥您的想象力来寻找断点的好地方。例如,您可以在 exit() 函数上设置 bp。