Linux系统日志segment分析

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 bit1bit0, 所以它的取值范围是0~7.

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

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

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

 

可以看到:

6 ——表示用户态程序内存访问越界,同时写操作导致内存访问越界

4 ——表示用户态程序内存访问越界

 

2.    0000000000629fd5 这个表示堆栈里面的编号,利用

readelf -s a.out > temp 可以查看符号表,就能找到对应的函数了。
objdump -d a.out > a.s
可以反汇编,不但能找到函数,还能直接定位到指令

将计算模块的可执行程序进行反汇编:

*.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 出了问题?

你可能感兴趣的:(c,linux,server,汇编)