问题描述
线上服务器异常复位,产生了vmcore文件,发现是内核接收报文时,访问了空指针导致,堆栈信息如下:
分析及定位
1、分析vmcore文件
根据core信息,访问异常的代码行:
/usr/src/debug/kernel-3.10.0-327.22.2.el7/linux-3.10.0-327.22.2.el7.x86_64/net/core/dev.c: 3483
通过反汇编异常地址,得到如下信息:
__netif_receive_skb_core反汇编代码如下所示,分析了调用过程,并确认异常寄存器存储的变量信息:
1 crash> dis -l __netif_receive_skb_core2 /usr/src/debug/kernel-3.10.0-327.22.2.el7/linux-3.10.0-327.22.2.el7.x86_64/net/core/dev.c: 3460
3 0xffffffff8152d150 <__netif_receive_skb_core>: nopl 0x0(%rax,%rax,1) [FTRACE NOP]4 0xffffffff8152d155 <__netif_receive_skb_core>: push%rbp5 0xffffffff8152d156 <__netif_receive_skb_core>: mov%rsp,%rbp6 0xffffffff8152d159 <__netif_receive_skb_core>: push%r157 0xffffffff8152d15b <__netif_receive_skb_core>: push%r148 0xffffffff8152d15d <__netif_receive_skb_core>: push%r139 0xffffffff8152d15f <__netif_receive_skb_core>: mov%esi,%r13 ##第二个参数10 0xffffffff8152d162 <__netif_receive_skb_core>: push%r1211 0xffffffff8152d164 <__netif_receive_skb_core>: push%rbx12 0xffffffff8152d165 <__netif_receive_skb_core>: sub$0x28,%rsp13 0xffffffff8152d169 <__netif_receive_skb_core>: mov%rdi,-0x40(%rbp) ## rdi 第一个参数, 即skb参数14 0xffffffff8152d16d <__netif_receive_skb_core>: mov %gs:0x28,%rax15 0xffffffff8152d176 <__netif_receive_skb_core>: mov%rax,-0x30(%rbp)16 0xffffffff8152d17a <__netif_receive_skb_core>: xor%eax,%eax17 0xffffffff8152d17c <__netif_receive_skb_core>: jmpq 0xffffffff8152d650 <__netif_receive_skb_core>18 /usr/src/debug/kernel-3.10.0-327.22.2.el7/linux-3.10.0-327.22.2.el7.x86_64/arch/x86/include/asm/jump_label.h: 16
19 0xffffffff8152d181 <__netif_receive_skb_core>: mov-0x40(%rbp),%r12 ## 把skb值赋值给r1220 0xffffffff8152d185 <__netif_receive_skb_core>: nopl 0x0(%rax,%rax,1)21 /usr/src/debug/kernel-3.10.0-327.22.2.el7/linux-3.10.0-327.22.2.el7.x86_64/include/linux/skbuf