编辑代码

Makefile

CFLAGS = -rdynamic -g
去掉-O

编译环境下:addr2line -e KE104M 0x0000(错误地址)

#if defined (__unix)
#include <execinfo.h>     /* for backtrace() */  
#endif

#define BACKTRACE_SIZE   16  

void dump(void)  
{  
    int  j=0, nptrs=0;  
	CHAR msg[1024] = {0};
	T_SYSTEMTIME st;
	
	GetCurrent_Time(&st);

#if defined (__unix)
    void *buffer[BACKTRACE_SIZE];  
    char **strings;  

    nptrs = backtrace(buffer, BACKTRACE_SIZE);  
	
    printf("backtrace() returned %d addresses\n", nptrs);  
	
    strings = backtrace_symbols(buffer, nptrs);  
    if (strings == NULL) {  
        perror("backtrace_symbols");  
        exit(EXIT_FAILURE);  
    }  
	
    for (j = 0; j < nptrs; j++)  {
        printf("  [%02d] %s\n", j, strings[j]);  
		sprintf(msg, "  [%02d] %s\n", j, strings[j]);
		Printf_Info(msg, &st);
	}
	
    free(strings);  
#endif

}  

void signal_handler(int signo)  
{  
    char buff[64] = {0x00};  
#if defined (__unix)

    sprintf(buff,"cat /proc/%d/maps", getpid());  
	
    system((const char*) buff);  
  
    printf("\n=========>>>catch signal %d <<<=========\n", signo);  
	
    printf("Dump stack start...\n");  
    dump();  
    printf("Dump stack end...\n");  
	
    signal(signo, SIG_DFL); /* 恢复信号默认处理 */  
    raise(signo);           /* 重新发送信号 */  
#endif
}  



void main()
{
  signal(SIGSEGV, signal_handler);


}