linux segfault at 问题定位实践

问题:

程序崩溃,打印为:

app[13016]: segfault at 7fb668d29930 ip 00007fb668d3c23c sp 00007fb668e7de20 error 7 in mydefine.so[7fb668d34000+11000]

定位步骤:
  1. 基础分析数据,大概了解反馈信息

(根据chatGPT)

这是由名为“app”的应用程序2生成的消息,指示应用程序由于分段错误而崩溃。

特定的错误消息指示故障发生在内存地址“7fb668d29930”,

指令指针“ip”位于地址“00007fb668d3c23c”。

崩溃时的“sp”或堆栈指针位于地址“00007fb668e7de20”。

“错误 7”代码指示与无效内存引用相关的特定类型的分段错误。

消息的最后一部分提供有关崩溃原因的其他信息。它指示崩溃发生在名为“mydefine.so”的共享库中,并且该库的基址为“7fb668d34000”,大小为“11000”字节。这表明应用程序正在使用共享库中的代码,并且错误发生在此代码中。

总体而言,此错误消息提供了一些用于调试崩溃的有用信息,包括发生故障的内存地址和指令指针、分段错误的类型以及发生崩溃时正在使用的共享库的名称和位置。但是,可能需要进一步调查以确定故障的具体原因并解决问题。

2.计算偏移地址

偏移地址= 指令指针 - 库的基地址。

 
  1. 7fb668d3c23c

  2. - 7fb668d34000

  3. = 823C

这里仅仅使用了ip和so的基地址,其他的内存和sp地址信息暂未使用。

3.寻找对应的汇编位置

这里查看了objdump -S mydefine.so的信息中包含了:

 
  1. Disassembly of section .text:

  2. 0000000000010f00 <deregister_tm_clones>:

  3. 10f00: 48 8d 3d 31 16 01 00 lea 0x11631(%rip),%rdi # 22538 <__TMC_END__>

  4. 10f07: 48 8d 05 2a 16 01 00 lea 0x1162a(%rip),%rax # 22538 <__TMC_END__>

  5. ......

  6. ......

这个根本没有823C,最低从10f00开始。

这是当然的,因为823c是偏移值!

计算值:

823c + 10f00 = 1913c

就是要找到的出错的地址。

接着就将objdump -S mydefine.so > 1.txt

生成独立的文件,用编辑工具打开来查看对应的1913c是属于哪一个函数,然后打开源码进行对应,定位是哪一个函数的哪一行出现的问题。

4.对照源码,寻找出错源码行

由于可能程序使用了编译优化指令(如-O3等),所以需要对照着源码来猜测大概的行。

这里需要个人对汇编的基本理解和objdump生成的右侧的提示注释来自行判断。

这里这个单个例子的结果还是满意的,后续其他例子有问题再补充其他情况如何定位问题。

error7: 111

bit2:值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界

bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界

bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址

linux segfault at 问题定位实践-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值