通用的信号量捕获打印调用栈接口
通用的信号量捕获打印调用栈接口
最近研究的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...\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(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)即可