许多应用程序在崩溃时会生成错误日志,这样可以很容易地找到错误。为了达到同样的效果,我使用 Linux 信号处理来捕获分段错误。我使用stacktrace.h生成跟踪:
void sigsegvHandler(int)
{
signal(SIGABRT, 0);
signal(SIGSEGV, 0);
FILE * errorLog;
errorLog = fopen ("/tmp/myapp.log" , "w");
qDebug() << "\n\n*************************************************************\n";
qDebug() << "Catching SIGSEGV, please report a bug at http://mysite.com/bugs
qDebug() << "MyApp version: " << "1.0-1" << "\n";
print_stacktrace(errorLog);
fclose(errorLog);
raise(SIGSEGV);
}
但是生成的跟踪几乎没有说明崩溃。如果我们使用应用程序的调试版本,就不可能生成指向发生崩溃的代码中的行号的跟踪,就像我们使用 gdb 时发生的那样。