core dump

#include <execinfo.h>  
#include <pthread.h>
#include <signal.h>


static void print_trace(int iSig)   

{   
    int i;   
    const int MAX_CALLSTACK_DEPTH = 32;    /* 需要打印堆栈的最大深度 */  
    void *traceback[MAX_CALLSTACK_DEPTH];  /* 用来存储调用堆栈中的地址 */  
    /* 利用 addr2line 命令可以打印出一个函数地址所在的源代码位置   
     * 调用格式为: addr2line -f -e /tmp/a.out 0x400618  
     * 使用前,源代码编译时要加上 -rdynamic -g 选项  
     */  
    char cmd[512] = "addr2line -f -e ";   
    char *prog = cmd + strlen(cmd);   
    /* 得到当前可执行程序的路径和文件名 */  
    int r = readlink("/proc/self/exe",prog,sizeof(cmd)-(prog-cmd)-1);   
    /* popen会fork出一个子进程来调用/bin/sh, 并执行cmd字符串中的命令,  
     * 同时,会创建一个管道,由于参数是'w', 管道将与标准输入相连接,  
     * 并返回一个FILE的指针fp指向所创建的管道,以后只要用fp往管理里写任何内容,  
     * 内容都会被送往到标准输入,  
     * 在下面的代码中,会将调用堆栈中的函数地址写入管道中,  
     * addr2line程序会从标准输入中得到该函数地址,然后根据地址打印出源代码位置和函数名。  
     */  
    FILE *fp = popen(cmd, "w");   
    /* 得到当前调用堆栈中的所有函数地址,放到traceback数组中 */  
    int depth = backtrace(traceback, MAX_CALLSTACK_DEPTH);   
    for (i = 0; i < depth; i++)   
    {   
        /* 得到调用堆栈中的函数的地址,然后将地址发送给 addr2line */  
        fprintf(fp, " %p\n", traceback[i]);   
        /* addr2line 命令在收到地址后,会将函数地址所在的源代码位置打印到标准输出 */  
    }   
    fclose(fp);  


    if (iSig != 0)
        signal(iSig, NULL);
        
    //exit(-1);

}


    signal(SIGSEGV, print_trace);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值