ARM Linux BackTrace

2019-07-13 07:39发布


/*
特此声明:感谢前人种树。

如果是x86平台gcc编译,可以直接编译。
如果是ARM平台arm-linux-gcc交叉编译,需要带如下编译参数 -rdynamic  -funwind-tables  -ffunction-sections
否则可能backtrace返回值为0,得不到需要的信息。
*/
#include    #include    #include    #include    #include   
void dump(int signo)   {       void *buffer[30] = {0};       size_t size;       char **strings = NULL;       size_t i = 0;  
    size = backtrace(buffer, 30);       fprintf(stdout, "Obtained %zd stack frames.nm ", size);       strings = backtrace_symbols(buffer, size);       if (strings == NULL)       {           perror("backtrace_symbols.");           exit(EXIT_FAILURE);       }  
    for (i = 0; i < size; i++)       {           fprintf(stdout, "%s ", strings[i]);       }       free(strings);       strings = NULL;       exit(0);   }  
void func_c()   {       *((volatile char *)0x0) = 0x9999;   }  
void func_b()   {       func_c();   }  
void func_a()   {       func_b();   }  
int main(int argc, const char *argv[])   {       if (signal(SIGSEGV, dump) == SIG_ERR)           perror("can't catch SIGSEGV");  
    func_a();       return 0;   }