Linux系统日志下segment fault
1. 系统日志分析——得出大概的错误类型:
Linux 下载下来的系统日志:
192.168.196.155 Dec 1 15:11:00 adapi196155 kernel: ad_calc_server[9341]: segfault at 00002a00cfbf1e80 rip 0000003ad10b7672 rsp 00002aad4cf1ceb8 error 6
192.168.197.155 Dec 1 16:13:57 adapi197155 kernel: ad_calc_server[29351]: segfault at 00002a00643d1c40 rip 0000000000629fd5 rsp 00002aad0dd73f70 error 4
依据右面的错误码:
error number 是由三个字位组成的,从高到底分别为bit2 bit1 和bit0, 所以它的取值范围是0~7.· bit2: 值为1 表示是用户态程序内存访问越界,值为0 表示是内核态程序内存访问越界 · bit1: 值为1 表示是写操作导致内存访问越界,值为0 表示是读操作导致内存访问越界 · bit0: 值为1 表示没有足够的权限访问非法地址的内容,值为0 表示访问的非法地址根本没有对应的页面,也就是无效地址 |
可以看到:
6 ——表示用户态程序内存访问越界,同时写操作导致内存访问越界
4 ——表示用户态程序内存访问越界
2. 0000000000629fd5 这个表示堆栈里面的编号,利用
readelf -s a.out > temp 可以查看符号表,就能找到对应的函数了。 |
将计算模块的可执行程序进行反汇编:
在*.s 中找到: 629fd5 : 48 8b 40 10 mov 0x10(%rax),%rax
它属于这个段的:
0000000000 629f96 <_ZNSt3tr19hashtableISsSt4pairIKSsSsESaIS3_EN8Internal10extract1stIS3_EESt8equal_toISsENS_4hashISsEENS5_17mod_range_hashingENS5_19default_ranged_hashENS5_19prime_rehash_policyELb0ELb0ELb1EE18m_deallocate_nodesEPPNS5_9hash_nodeIS3_Lb0EEEm>:
在符号表temp 文件中找到:
4562: 0000000000 629f96 127 FUNC WEAK DEFAULT 12 _ZNSt3tr19hashtableISsSt4
可以看出可能是hashtable 出了问题?