dmesg 崩溃分析

dmesg 查看

segfault  各项含义

[ 7953.241716] test.out[46470]: segfault at 0 ip 00007f8f091db100 sp 00007ffe0ffa31c8 error 6 in libadd.so[7f8f091db000+1000]

at 引起故障的地址

ip 指令的内存地址

sp 堆栈指针地址, 即栈顶指针

error 是由三个字位组成的,从高到底分别为bit2 bit1和bit0,所以它的取值范围是0~7. 此例为6 -> 110

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

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

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

[7f8f091db000+1000] 对象崩溃时映射的虚拟内存起始地址和大小

此例出错在 libadd.so 中,程序起始映射地址为7f8f091db000, 崩溃时指令地址为 00007f8f091db100 ,则指令的偏移地址为(00007f8f091db100 - 7f8f091db000 = 100)

反汇编

使用objdump命令得到 libadd.so 的反汇编信息:

objdump -d libadd.so > libtmp

dmesg 崩溃分析_第1张图片

起始地址 + 偏移量 = 错误指令地址   1000 + 100= 1100

根据上述信息过滤到命令:

dmesg 崩溃分析_第2张图片

测试代码

此代码出错在add() 函数中,在本文件的第6行

dmesg 崩溃分析_第3张图片

结果分析

1、根据地址和指令分析

根据 上述的 1100 位置指令 movl 命令,在函数add() 中,并且为赋值命令,则为第6行出错

2、使用 addr2line

 查看出错的函数和行号

如果编译时不加-g 则没有行号

你可能感兴趣的:(调试,linux,编程相关,linux,服务器)