void dump(int signo)
{
void* array[100];
size_t size;
char** strings;
size = backtrace(array, 100);
strings = backtrace_symbols(array, size);
printf("Obtained %zd stacks.\n", size);
for (int i = 0; i < size; i++) {
printf("%s\n", strings[i]);
}
//------------------
char buf[128] = { 0 };
sprintf(buf, "cat /proc/%d/maps", getpid());
system((const char*)buf);
free(strings);
exit(0);
}
在main中
signal(SIGSEGV, &dump);
qt的pro文件中加入
QMAKE_CXXFLAGS += -rdynamic -funwind-tables -ffunction-sections
模拟一次崩溃
int* p = NULL;
*p = 1234;
程序可以以profile模式编译
编译完成放到开发板中运行
程序成功崩溃
崩溃的代码位置0x17bd2 0x1721c
在qt编译出来的profile文件夹中
arm-linux-gnueabihf-addr2line -e CGM_BASE 0x17bd2
成功打印崩溃代码的文件和行数
使用debug编译 或 profile编译 可以成功显示出错位置,用release编译不行