在可执行文件上重复运行GDB(并在崩溃/错误时停止)

时间:2012-05-04 09:15:58

标签: c++ gdb

我正在尝试找出一种方法来重复运行GDB 的可执行文件,并最好暂停错误。

我在手册中找不到办法做到这一点!

由于

5 个答案:

答案 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)

循环+ 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

答案 4 :(得分:0)

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

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

您可以直接按 CTRL-C 来停止执行。当然,GDB 会在发现分段错误或其他断点时停止执行,让您捕获错误。

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