通用的信号量捕获打印调用栈接口

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

posted @ 2013-12-16 20:37  日月王  阅读(475)  评论(0编辑  收藏  举报