我的代码中似乎有一些多线程错误,每30次运行一次测试套件就会崩溃一次.测试套件是非交互式的.我想在gdb中运行我的测试套件,并且如果程序正常退出则正常退出gdb,如果崩溃则中断(并显示调试提示).这样我可以让测试套件反复运行,去拿一杯咖啡,回来,并提供一个很好的调试提示.我怎么能用gdb做到这一点?
acm*_*acm 22
这有点hacky但你可以这样做:
gdb -ex='set confirm on' -ex=run -ex=quit --args ./a.out
Run Code Online (Sandbox Code Playgroud)
如果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)
Run Code Online (Sandbox Code Playgroud)
就像我说的那样,不漂亮,但只要你没有切换出一个活动进程退出的提示,它就可以了.可能还有一种使用gdb quit命令的方法:它接受一个数字参数,它是调试会话的退出代码.所以也许你可以使用--eval-command ="quit 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;
}
Run Code Online (Sandbox Code Playgroud)
最简单的方法是使用以下提供的Python APIgdb:
def exit_handler(event):
gdb.execute("quit")
gdb.events.exited.connect(exit_handler)
Run Code Online (Sandbox Code Playgroud)
你甚至可以用一行来做:
(gdb) gdb.events.exited.connect(lambda x : gdb.execute("quit")
Run Code Online (Sandbox Code Playgroud)
您还可以检查返回代码,以确保它是您期望的"正常"代码event.exit_code.
您可以与@acm一起使用它--eval-command或者--command从@acm中提到它来从命令行或.gdbinit文件注册事件处理程序.
您还可以在程序崩溃时触发回溯,并使用子进程的返回代码让gdb退出:
gdb -return-child-result -ex run -ex "thread apply all bt" -ex "quit" --args myProgram -myProgramArg
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8511 次 |
| 最近记录: |