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编译不行
该程序定义了一个信号处理函数voiddump,用于在接收到SIGSEGV信号(段错误)时,获取并打印堆栈跟踪信息。通过backtrace和backtrace_symbols函数获取调用栈,然后使用addr2line定位到源代码中的具体位置。在Qt项目配置中,添加了特定的编译标志以支持调试信息。在profile模式下,程序能成功显示错误位置,但在release模式下无法显示,这可能是因为release模式下优化导致的调试信息丢失。
1385

被折叠的 条评论
为什么被折叠?



