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
起始地址 + 偏移量 = 错误指令地址 1000 + 100= 1100
根据上述信息过滤到命令:
测试代码
此代码出错在add() 函数中,在本文件的第6行
结果分析
1、根据地址和指令分析
根据 上述的 1100 位置指令 movl 命令,在函数add() 中,并且为赋值命令,则为第6行出错
2、使用 addr2line
查看出错的函数和行号
如果编译时不加-g 则没有行号