zoukankan      html  css  js  c++  java
  • 通用的信号量捕获打印调用栈接口

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

  • 相关阅读:
    mysql索引类型 normal, unique, full text
    16.信号量互斥编程
    15.信号通信编程
    14.有名管道通信
    13.无名管道通讯编程
    12.多进程程序的操作
    11.进程控制理论
    10.时间编程
    9. 库函数方式文件编程
    8.Linux文件编程
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/3477377.html
Copyright © 2011-2022 走看看