最近研究的XBMC静态链接,时常出现一些段错误,程序崩溃后还没有调用栈,坑爹的节奏啊
通过google搜索后,找到一个较好的办法解决这个问题,主要是利用glibc的backtraces接口。
就写了一个通用的文件,使用时只需要在main函数前包含这个文件,然后在main入口调用一个函数就可以捕获指定信号量并打印当时的调用栈了
#ifndef __SIG_BACK_TRACES_C__ #define __SIG_BACK_TRACES_C__ #include <stdio.h> #include <signal.h> #include <execinfo.h> #ifdef __cplusplus extern "C" { #endif #define BACK_TRACES_ARRAY_SIZE 20 static void __signal_act_function(int signo) { int i; int depth = 0; char** symbols = NULL; char* stack[BACK_TRACES_ARRAY_SIZE] = {0}; printf("Signal caught:%u, dumping backtrace... ", signo); depth = backtrace( (void**)(stack), sizeof(stack)/sizeof(stack[0])); if (depth) { symbols = backtrace_symbols((void**)(stack), depth); if (symbols) { for(i = 0; i < depth; i++) { printf("===[%u]:%s ", (i+1), symbols[i]); } } free(symbols); } sleep(5); //re-throw raise(signo); } static void __set_signal_no_print_bt(int signo) { struct sigaction act; act.sa_handler = & __signal_act_function ; act.sa_flags |= SA_RESETHAND; //one-time only sigaction(SIGSEGV, &act, NULL); } #ifdef __cplusplus } #endif #endif
在main函数中调用__set_signal_no_print_bt(xxx)即可