我不知道是否有可能通过GDB启动应用程序,在一个段错误写回溯到一个文件(在稍后看),然后退出GDB完全不需要任何用户输入。没有用户输入的gdb回溯?
我在一个无限循环(所以如果它崩溃,重新加载)在OS的启动从一个非交互式会话中运行一个shell脚本的应用程序。该应用程序以不可重现的方式崩溃,所以我需要从崩溃中回溯以调试问题。理想情况下,我只是修改shell脚本以包含GDB调试+回溯功能,并保留崩溃后应用程序的自动重新启动。
这可能吗?
我不知道是否有可能通过GDB启动应用程序,在一个段错误写回溯到一个文件(在稍后看),然后退出GDB完全不需要任何用户输入。没有用户输入的gdb回溯?
我在一个无限循环(所以如果它崩溃,重新加载)在OS的启动从一个非交互式会话中运行一个shell脚本的应用程序。该应用程序以不可重现的方式崩溃,所以我需要从崩溃中回溯以调试问题。理想情况下,我只是修改shell脚本以包含GDB调试+回溯功能,并保留崩溃后应用程序的自动重新启动。
这可能吗?
由于阿迪蒂亚·库马尔;可接受的解决方案:
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
或者只是存储回溯,你可以把ulimit -c unlimited
在您的shell脚本的无限循环之前。其结果将是,每次你的程序段错误,它会写一个核心转储到这我的系统上就被称为core
,但对其他系统可能包括进程ID文件。如果程序存在段错误(您从退出状态中看到此错误等于139),那么只需使用唯一名称(例如使用时间戳)将core
文件移动到安全位置。有了这些核心文件和gdb,你就可以做更多的事情,而不仅仅是看回溯。因此我想用它们可能对你更有用。
http://www.commandlinefu.com/commands/view/4039/print-stack-trace-of-a-core-file-without-needing-to-enter-gdb-interactively –
你不能启用核心你的系统上的文件并以这种方式获取回溯?看起来比gdb循环更容易。 –
'所以我需要从崩溃回溯调试issue.' - 我还没有找到一个答案,为什么你不能从崩溃分析的核心文件?这是因为它相当大吗? –