如果程序成功,如何让gdb退出,如果程序崩溃,如何中断?
我的代码中似乎存在某种多线程错误,使其测试套件每运行30次就会崩溃一次。测试套件是非交互式的。我想在gdb中运行我的测试套件,如果程序正常退出,则让gdb正常退出;如果程序崩溃,则中断(并显示调试提示)。这样我就可以让测试套件重复运行,去喝杯咖啡,然后回来,并得到一个很好的调试提示。如何使用gdb实现这一点?使其在崩溃时转储内核。如果您在linux上,请阅读如果程序成功,如何让gdb退出,如果程序崩溃,如何中断?,gdb,Gdb,我的代码中似乎存在某种多线程错误,使其测试套件每运行30次就会崩溃一次。测试套件是非交互式的。我想在gdb中运行我的测试套件,如果程序正常退出,则让gdb正常退出;如果程序崩溃,则中断(并显示调试提示)。这样我就可以让测试套件重复运行,去喝杯咖啡,然后回来,并得到一个很好的调试提示。如何使用gdb实现这一点?使其在崩溃时转储内核。如果您在linux上,请阅读man-core手册页,如果您正在运行bash,请阅读ulimitbuiltin 这样,当它崩溃时,您会发现一个很好的corefile,您可
man-core
手册页,如果您正在运行bash
,请阅读ulimit
builtin
这样,当它崩溃时,您会发现一个很好的corefile,您可以将其提供给gdb:
$ ulimit -c unlimited
$ ... run program ..., gopher coffee (or reddit ;)
$ gdb progname corefile
这是一个有点黑客,但你可以做:
gdb -ex='set confirm on' -ex=run -ex=quit --args ./a.out
如果a.out正常终止,它将使您退出GDB。但如果您崩溃,程序仍将处于活动状态,因此如果您真的想使用活动状态退出,GDB通常会提示:
Program received signal SIGABRT, Aborted.
0x00007ffff72dad05 in raise (sig=...) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
64 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
in ../nptl/sysdeps/unix/sysv/linux/raise.c
A debugging session is active.
Inferior 1 [process 15126] will be killed.
Quit anyway? (y or n)
就像我说的,不漂亮,但它可以工作,只要你没有关闭提示退出一个活动的进程。可能还有一种方法可以使用gdb的quit
命令:它接受一个数字参数,该参数是调试会话的退出代码。因此,也许您可以使用--eval command=“quit stuff”,其中stuff是一些GDB表达式,它反映了下级是否正在运行
此程序可用于测试:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
if (time(NULL) % 2) {
raise(SIGINT);
}
puts("no crash");
return EXIT_SUCCESS;
}
#包括
#包括
#包括
#包括
int main(){
如果(时间(空)%2){
升起(SIGINT);
}
看跌期权(“无崩溃”);
返回退出成功;
}
当核心文件崩溃时,您是否没有得到它?像这样启动gdb“gdb-c核心”,并执行堆栈回溯
您更可能希望使用Valgrind。最简单的方法是使用
gdb提供的:
def exit_handler(event):
gdb.execute("quit")
gdb.events.exited.connect(exit_handler)
您甚至可以用一行代码来完成:
(gdb) gdb.events.exited.connect(lambda x : gdb.execute("quit")
您还可以检查返回代码,以确保它是事件中预期的“正常”代码。退出\u code
您可以将它与@acm提到的--eval command
或--command
结合使用,以从命令行注册事件处理程序,或与.gdbinit
文件一起使用 您还可以在程序崩溃时触发回溯,并让gdb以子进程的返回代码退出:
gdb -return-child-result -ex run -ex "thread apply all bt" -ex "quit" --args myProgram -myProgramArg
创建一个名为.gdbinit
的文件,它将在启动gdb时使用
run
quit
无选项运行:
gdb --args prog arg1...
您正在告诉gdb运行并退出,但如果出现错误,它应该停止处理该文件。如果您在~/.gdbinit
文件中放入以下行,gdb
将在程序退出时以0的状态代码退出
python
def exit_handler ( event ):
if event .exit_code == 0:
gdb .execute ( "quit" )
gdb .events .exited .connect ( exit_handler )
end
以上是对Kevin答案的改进。我使用的是OS X Snow Leopard,这里的gdb不支持--eval命令,但我还是会选择你的答案。我认为如果你的文件中有一个设置confirm off
,这将不起作用。gdbinit
文件,gdb将始终返回…gdb--eval command=run--eval command=“set confirm off”--eval command=bt--eval command=quit--args./a.out这不是这个问题的最佳答案,但它对我的问题有很大帮助!谢谢,不知道-返回子结果