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)即可

  • 相关阅读:
    小熊派接入华为IOT
    VS2022 C++ 支持热重载
    Go入门笔记43HGet查询
    Go入门笔记45在WSL2上测试串口编程
    Yarn全新安装
    EdgexGo2.0学习19 no secty依然提示让输入token
    Ubuntu20.04安装Emqx
    shell脚本中echo显示内容带颜色
    EdgexGo2.0学习20 编译EdgeX Go UI
    EdgexGo2.0学习18 消息总线目标
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/3477377.html
Copyright © 2011-2022 走看看