利用Backtrace来捕获段错误堆栈信息

it2026-01-08  8

具体参考文档:https://blog.csdn.net/gatieme/article/details/84189280

测试Demo:

#include <execinfo.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <stddef.h> void print_trace(void) { void* array[30]; size_t size; char** strings; size_t i; size = backtrace(array, 30); strings = backtrace_symbols(array, size); if (NULL == strings) { perror("backtrace_symbols"); exit(EXIT_FAILURE); } printf("Obtained %zd stack frames.\n", size); for(i = 0 ; i < size; i++) { printf("%s\n", strings[i]); } free(strings); strings = NULL; exit(EXIT_SUCCESS); } void sighandler_dump_stack(int sig) { psignal(sig, "handler"); // 打印信号相关信息 print_trace(); signal(sig, SIG_DFL); // 恢复信号默认处理 raise(sig); // 继续后续的流程 } void dumy_function(void) { print_trace(); } void func_c() { *((volatile int*)0x00) = 0x100; } void func_b() { func_c(); } void func_a() { func_b(); } int main(int argc, char* argv[]) { if (signal(SIGSEGV, sighandler_dump_stack) == SIG_ERR) perror("signal failed"); // 在标准错误输出上打印格式: 自定义信息(调用函数名+failed): errno的具体描述 func_a(); return 0; }

使用注意事项: 编译时,需要加上

-g : 增加调试信息-rdynamic : 增加符号名称支持

得到段错误时,如何定位错误

在查看堆栈前,进入捕获 SIGSEGV 信号自定义函数前的地址addr,再根据

查看异常函数位置:

add32line -C -f -e ./exe_name addr 输出如下:

查看发生异常的函数源码信息

objdump -DS ./handler | grep -6 "400c74" 输出如下:

转载于:https://www.cnblogs.com/cherishui/p/10341048.html

最新回复(0)