Makefile
CFLAGS = -rdynamic -g
去掉-O
编译环境下:addr2line -e KE104M 0x0000(错误地址)
#if defined (__unix)
#include <execinfo.h>
#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);
}