006 解决段错误的方法

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.csdn.net/kz01081/article/details/103263735

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值