最近研究的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)即可

标签: none

添加新评论