17

我试图找出一种方法来重复运行 GDB 的可执行文件,最好在错误时停止。

我在手册中找不到这样做的方法!

谢谢

4

5 回答 5

17

我试过(在 Bash 中):

while true ; do gdb -ex run a.out -ex quit ; done ;

不幸的是,这被证明是相当棘手的,但它确实自动运行,当程序崩溃时(我用一个导致 SIGABRT 的旧程序进行测试),gdb 询问“程序正在运行。无论如何退出?(y或 n)",所以只需按 n。

于 2012-05-04T09:24:24.167 回答
7

我遇到了同样的问题,并想出了一个我认为是停止 BoBTFish 建议的无限循环的相当好的方法。

您可以使用虚拟文件的存在来控制循环,而不是while true循环,例如:

touch loopfile; while [ -f loopfile ] ; do gdb -ex run a.out -ex quit ; done ;

当您想停止无限调试会话时,您可以在同一目录中打开一个新终端,并且您可以通过中断并从其中删除从rm loopfile同一终端退出:control-cloopfilegdb

^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

希望这对将来的某些人有用,这似乎是调试间歇性问题的一种不错的(如果是骇人听闻的)方法。

于 2012-08-08T05:18:27.593 回答
3

循环 + LD 路径 + 命令行参数示例

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
于 2014-05-09T13:36:33.253 回答
2

使用 shell 脚本重复运行gdb,并使用--batch -x <cmdfile>选项gdb指定一个命令文件,该文件只包含run运行程序的单词。所以是这样的:

$ echo run > cmdfile ; while gdb --batch -x cmdfile myprogram ; do : ; done
于 2012-05-04T09:23:05.173 回答
1

一种简单的方法是在代码末尾放置一个断点,并配置断点命令以再次运行程序。例如,如果您的程序总是通过最后一条主线(假设没有突然退出),那么您可以:

(gdb) b <last line of main here>
(gdb) commands
> run [command line args]
> end

您可能只是 CTRL-C 停止执行。当然,如果 GDB 发现分段错误或另一个断点,GDB 将停止执行,从而允许您捕获错误。

对于大多数复杂的情况,您可以发挥您的想象力来寻找断点的好地方。例如,您可以在 exit() 函数上设置 bp。

于 2021-03-11T21:35:25.730 回答