これが私のプログラムで使用しているものです、それは私のために働きます....私のプログラムがクラッシュするたびに、クラッシュサイトのスタックトレースをstdoutに出力します(おそらくファイルなどにリダイレクトされ、後で読むことができます)。
スタックトレースに人間が読み取れる関数名が含まれていることを確認するために、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...]
}