Linux下一般情况程序出现段错误异常崩溃时,并不会产生core文件,此时可借助/var/log/messages中打印的错误信息进行排查。如下错误信息:
segfault at 7f30beffe000 ip 00007f30c6eebda9 sp 00007f30a7ffc4a0 error 4 in libc-2.17.so[7f30c6e56000+1c3000]
其中,异常在libc-2.17.so库中,00007f30beffe000为出错地址,7f30c6eebda9为指令地址,00007f30a7ffc4a0为栈变指寄存器。error 4代表用户态读取内存越界 7f30c6e56000为libc-2.17.so映射到程序内存的基地址。
偏移地址 = 指令地址 - 基地址 ---------------> 95DA9 = 7f30c6eebda9 - 7f30c6e56000
通过偏移地址查找所在的函数,
[root@localhost ~]# objdump -tT /lib64/libc-2.17.so | grep 095a
0000000000095a70 l F .text 0000000000000415 __GI_memmem
0000000000095a70 g F .text 0000000000000415 memmem
0000000000095a70 g DF .text 0000000000000415 GLIBC_2.2.5 memmem
由此可判断是出错memmem函数中,此时我们再反汇编libc-2.17.so,找到对应函数的汇编代码,查到对应偏移地址
关于error错误码:
/*
* Page fault error code bits:
*
* bit 0 == 0: no page found 1: protection fault
* bit 1 == 0: read access 1: write access
* bit 2 == 0: kernel-mode access 1: user-mode access
* bit 3 == 1: use of reserved bit detected
* bit 4 == 1: fault was an instruction fetch
*/
enum x86_pf_error_code {
PF_PROT = 1 << 0,
PF_WRITE = 1 << 1,
PF_USER = 1 << 2,
PF_RSVD = 1 << 3,
PF_INSTR = 1 << 4,
};
更多推荐