Backtrace调试

/*
* DUMP使用注意事项:
* 1. 编译选项 -g -funwind-tables -ffunction-sections
* 2. 链接参数 -rdynamic
* 3. 去掉代码优化编译选项 -On 
* 4. 去掉栈指针优化选项 -fomit-frame-pointer
* 5. 动态库地址需要减去load基地址
* 6. 查看命令addr2line -e app.bin(执行文件或so库文件) 0xFFFF(地址)
*/
void dump_backtrace()
{
    void* buffer[200];
    int size = backtrace(buffer, sizeof(buffer));
    printf("\nbacktrace() returned %d addresses\n", size);

    char ** info = backtrace_symbols(buffer, size);
    for (int i=0; i>>catch signal %d <<<=========\n", signo);
    printf("trigger address: %p\n\n", info->si_addr);

    printf("************* backtrace ******************\n");
    dump_library_maps();
    printf("\n");
    dump_backtrace();
    printf("***************backtrace end********************\n");
    //signal(signo, SIG_DFL); //恢复默认处理 
    raise(signo);             //再发一次信号 
}

void watch_signal()
{
    //signal(SIGSEGV, signal_handler);
    struct sigaction act;
    sigemptyset(&act.sa_mask);
    act.sa_flags = SA_SIGINFO | SA_RESETHAND;
    act.sa_sigaction = signal_handler;
    sigaction(SIGSEGV, &act, NULL);
}

你可能感兴趣的:(c++,大数据)