下面是我在我的程序中使用的,它适用于我......每当我的程序崩溃时,它会将崩溃站点的堆栈跟踪打印到标准输出(大概是重定向到可以读取它的文件等)后来)。
请注意,您可能需要在Makefile中的CXXFLAGS和/或LFLAGS中将-rdynamic作为标志传递,以确保堆栈跟踪包含人类可读的函数名称。
#include <stdio.h>
#include <signal.h>
#include <execinfo.h>
void PrintStackTrace()
{
void *array[256];
size_t size = backtrace(array, 256);
char ** strings = backtrace_symbols(array, 256);
if (strings)
{
printf("--Stack trace follows (%zd frames):\n", size);
for (size_t i = 0; i < size; i++) printf(" %s\n", strings[i]);
printf("--End Stack trace\n");
free(strings);
}
else printf("PrintStackTrace: Error, could not generate stack trace!\n");
}
static void CrashSignalHandler(int sig)
{
// Uninstall this handler, to avoid the possibility of an infinite regress
signal(SIGSEGV, SIG_DFL);
signal(SIGBUS, SIG_DFL);
signal(SIGILL, SIG_DFL);
signal(SIGABRT, SIG_DFL);
signal(SIGFPE, SIG_DFL);
printf("CrashSignalHandler called with signal %i... I'm going to print a stack trace, then kill the process.\n", sig);
PrintStackTrace();
printf("Crashed process aborting now.... bye!\n");
fflush(stdout);
abort();
}
int main(int argc, char ** argv)
{
signal(SIGSEGV, CrashSignalHandler);
signal(SIGBUS, CrashSignalHandler);
signal(SIGILL, CrashSignalHandler);
signal(SIGABRT, CrashSignalHandler);
signal(SIGFPE, CrashSignalHandler);
[...remainder of your program goes here...]
}
是否有任何额外的线程,线程子系统,进程外服务器? '超级try-catch块'不会捕获在这种环境中引发的错误。 – 2012-04-11 22:20:37
是的,有多个线程。我已经为每个人添加了try-catch块。我甚至不知道什么是“进程外服务器”。从快速谷歌这看起来像Windows的东西,我可能是错的? – Pryo 2012-04-14 17:28:40