问题:

程序崩溃,打印为:

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.计算偏移地址

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

    7fb668d3c23c 
-   7fb668d34000 
=    823C 

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

3.寻找对应的汇编位置

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

Disassembly of section .text:
 
0000000000010f00 <deregister_tm_clones>:
   10f00:    48 8d 3d 31 16 01 00     lea    0x11631(%rip),%rdi        # 22538 <__TMC_END__>
   10f07:    48 8d 05 2a 16 01 00     lea    0x1162a(%rip),%rax        # 22538 <__TMC_END__>
    ......
    ......

这个根本没有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表示访问的非法地址根本没有对应的页面,也就是无效地址

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐