程序崩溃,打印为:
app[13016]: segfault at 7fb668d29930 ip 00007fb668d3c23c sp 00007fb668e7de20 error 7 in mydefine.so[7fb668d34000+11000]
(根据chatGPT)
这是由名为“app”的应用程序2生成的消息,指示应用程序由于分段错误而崩溃。
特定的错误消息指示故障发生在内存地址“7fb668d29930”,
指令指针“ip”位于地址“00007fb668d3c23c”。
崩溃时的“sp”或堆栈指针位于地址“00007fb668e7de20”。
“错误 7”代码指示与无效内存引用相关的特定类型的分段错误。
消息的最后一部分提供有关崩溃原因的其他信息。它指示崩溃发生在名为“mydefine.so”的共享库中,并且该库的基址为“7fb668d34000”,大小为“11000”字节。这表明应用程序正在使用共享库中的代码,并且错误发生在此代码中。
总体而言,此错误消息提供了一些用于调试崩溃的有用信息,包括发生故障的内存地址和指令指针、分段错误的类型以及发生崩溃时正在使用的共享库的名称和位置。但是,可能需要进一步调查以确定故障的具体原因并解决问题。
偏移地址= 指令指针 - 库的基地址。
7fb668d3c23c
- 7fb668d34000
= 823C
这里仅仅使用了ip和so的基地址,其他的内存和sp地址信息暂未使用。
用了objdump -S mydefine.so | grep 823c:
反馈:
1823c: 40 88 ac 08 30 1a 01 mov %bpl,0x11a30(%rax,%rcx,1)
和我们要的823c有点不一样,多了10000.
这里查看了objdump -S mydefine.so的信息中包含了:
Disassembly of section .text:0000000000010f00 :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,最低从10000开始?
由于计算的是指令地址,应该是.text中的偏移吧?大概是从10000偏移,这样的话1823c就是要找到的出错的地址。
接着就将objdump -S mydefine.so > 1.txt
生成独立的文件,用编辑工具打开来查看对应的1823c是属于哪一个函数,然后打开源码进行对应,定位是哪一个函数的哪一行出现的问题。
如本例子的大概定位如下:
0000000000018206 :18206: 55 push %rbp18207: 41 57 push %r1518209: 41 56 push %r14......1822e: 48 63 8b bc 02 00 00 movslq 0x2bc(%rbx),%rcx18235: 48 69 c9 00 6f 00 00 imul $0x6f00,%rcx,%rcx1823c: 40 88 ac 08 30 1a 01 mov %bpl,0x11a30(%rax,%rcx,1)......
由于可能程序使用了编译优化指令(如-O3等),所以需要对照着源码来猜测大概的行。
这里需要个人对汇编的基本理解和objdump生成的右侧的提示注释来自行判断。
这里这个单个例子的结果还是满意的,后续其他例子有问题再补充其他情况如何定位问题。