通用的信号量捕获打印调用栈接口
最近研究的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 __cplusplusextern "C"{#endif #define BACK_TRACES_ARRAY_SIZE 20 static void __signal_act_function(intsigno)
{inti;int depth = 0;char** symbols =NULL;char* stack[BACK_TRACES_ARRAY_SIZE] = {0};
printf("Signal caught:%u, dumping backtrace...\n", 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\n", (i+1), symbols[i]);
}
}
free(symbols);
}
sleep(5);//re-throw raise(signo);
}static void __set_signal_no_print_bt(intsigno)
{structsigaction 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)即可