1 段错误通常系统发送SIGSEGV 信号,所以在自己的程序中处理该信号,用signal可以设置信号处理函数
2 在信号处理函数中打印出回溯函数,有下面三个函数可用:
#include <execinfo.h>
int backtrace(void **buffer, int size);
char **backtrace_symbols(void *const *buffer, int size);
void backtrace_symbols_fd(void *const *buffer, int size, int fd);
3 利用上面三个函数打印出程序调用情况:信息如下:
backtrace() returned 8 addresses
./a.out(myfunc3+0x2e) [0x400af4]
./a.out() [0x400bc2]
./a.out(myfunc+0x25) [0x400bea]
./a.out(myfunc+0x1e) [0x400be3]
./a.out(myfunc+0x1e) [0x400be3]
./a.out(main+0x59) [0x400c46]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7f7cb2acc830]
./a.out(_start+0x29) [0x4009f9]
可以看出三个信息:一调用函数在哪个bin文件中,调用的函数名,调用的函数名,执行的代码地址
其中,小括号里和中括号都是地址
小括号里的内容若出现,需要加上 编译选项 -rdynamic
addr2line 可以将地址转为源码行数 addr2line -e a.out 0x400af4 ,需要加上编译选项 -g
[参考:]https://blog.youkuaiyun.com/kz01081/article/details/103263735
006 解决段错误的方法
最新推荐文章于 2021-12-01 20:45:04 发布