GDB回溯没有用户input?

我想知道是否可以通过GDB启动应用程序,在SegFault上将回溯写入文件(稍后查看),然后在没有任何用户input的情况下退出GDB。

我正在从一个非交互式会话的操作系统启动一个无限循环的shell脚本运行一个应用程序(所以如果它崩溃它重新加载)。 该应用程序崩溃在一个不可重现的方式,所以我需要从崩溃的回溯debugging问题。 理想情况下,我只是修改shell脚本以包含GDBdebugging+回溯function,并保留应用程序崩溃后的自动重新启动。

这可能吗?

Solutions Collecting From Web of "GDB回溯没有用户input?"

感谢Aditya Kumar; 可接受的方案

gdb -batch -ex "run" -ex "bt" ${my_program} 2>&1 | grep -v ^"No stack."$

这与gdb 7.6一起工作:

我的测试程序,如果它有一个命令行参数,导致核心转储:

 int a(int argc) { if (argc > 1) { int *p = 0; *p = *p +1; return *p; } else { return 0; } } int b(int argc) { return a(argc); } int main(int argc, char *argv[]) { int res = b(argc); return res; } 

我的Python脚本my_check.py:

 def my_signal_handler (event): if (isinstance(event, gdb.SignalEvent)): log_file_name = "a.out.crash." + str(gdb.selected_inferior().pid) + ".log" gdb.execute("set logging file " + log_file_name ) gdb.execute("set logging on") gdb.execute("set logging redirect on") gdb.execute("thread apply all bt") gdb.execute("q") gdb.events.stop.connect(my_signal_handler) gdb.execute("set confirm off") gdb.execute("set pagination off") gdb.execute("r") gdb.execute("q") 

所以,首先我运行a.out,没有崩溃。 没有创建日志文件:

gdb -q -x my_check.py –args ./a.out> / dev / null

接下来我运行a.out并给它一个参数:

 >gdb -q -x my_check.py --args ./a.out 1 >/dev/null 

这是一个崩溃报告:

 >cat a.out.crash.13554.log Thread 1 (process 13554): #0 0x0000000000400555 in a (argc=2) at main.cpp:5 #1 0x000000000040058a in b (argc=2) at main.cpp:15 #2 0x00000000004005a3 in main (argc=2, argv=0x7fffffffe198) at main.cpp:20 

或者只是存储回溯,你可以在你的shell脚本的无限循环前放ulimit -c unlimited 。 结果就是每次程序出现段错误时,它都会将一个核心转储写入一个文件,这个文件在我的系统中被称为core但在其他系统上可能包含进程ID。 如果程序存在段错误(从退出状态等于139时可以看到),那么只需使用唯一的名称(例如使用时间戳)将core文件移动到安全的位置即可。 有了这些核心文件和gdb,你甚至可以做更多的事情,而不仅仅是看回溯。 所以我想用它们可能对你更有用。