关于kdump与crash调试信息求助,麻烦看看是不是这两个软件安装设置有问题?
关于kdump与crash调试信息求助,麻烦看看是不是这两个软件安装设置有问题?利用vmlinux和vmcore以后:
# crash /usr/lib/debug/lib/modules/2.6.32-431.el6.i686/vmlinux /var/crash/127.0.0.1-2014-09-03-01:06:26/vmcore
crash 6.1.0-5.el6
Copyright (C) 2002-2012Red Hat, Inc.
Copyright (C) 2004, 2005, 2006, 2010IBM Corporation
Copyright (C) 1999-2006Hewlett-Packard Co
Copyright (C) 2005, 2006, 2011, 2012Fujitsu Limited
Copyright (C) 2006, 2007VA Linux Systems Japan K.K.
Copyright (C) 2005, 2011NEC Corporation
Copyright (C) 1999, 2002, 2007Silicon Graphics, Inc.
Copyright (C) 1999, 2000, 2001, 2002Mission Critical Linux, Inc.
This program is free software, covered by the GNU General Public License,
and you are welcome to change it and/or distribute copies of it under
certain conditions.Enter "help copying" to see the conditions.
This program has absolutely no warranty.Enter "help warranty" for details.
GNU gdb (GDB) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
KERNEL: /usr/lib/debug/lib/modules/2.6.32-431.el6.i686/vmlinux
DUMPFILE: /var/crash/127.0.0.1-2014-09-03-01:06:26/vmcore
CPUS: 8
DATE: Wed Sep3 01:06:22 2014
UPTIME: 1 days, 00:34:06
LOAD AVERAGE: 0.05, 0.01, 0.00
TASKS: 350
NODENAME: csc
RELEASE: 2.6.32-431.el6.i686
VERSION: #1 SMP Fri Nov 22 00:26:36 UTC 2013
MACHINE: i686(3392 Mhz)
MEMORY: 3.9 GB
PANIC: "Oops: 0000 [#1] SMP " (check log for details)
PID: 3219
COMMAND: "Xorg"
TASK: df021000
CPU: 0
STATE: TASK_RUNNING (PANIC)
然后我用crash>log命令以后发现如下(省略了前面部分):
......
hook_configAAAAAAAAAAAAAAAAAA----a = 2e
BUG: unable to handle kernel NULL pointer dereference at 00000001
IP: [<f81018e8>] FindInsrcPortHashTable+0x8/0x140
*pdpt = 0000000033be3001 *pde = 000000011dad8067
Oops: 0000 [#1] SMP
last sysfs file: /sys/devices/virtual/block/dm-2/dm/name
Modules linked in: hook_config1(U) hook_config_message1(U) vfat fat usb_storag
............
hook_configAAAAAAAAAAAAAAAAAA----a = 2b
60060002
hook_configAAAAAAAAAAAAAAAAAA----a = 2c
60060002
hook_configAAAAAAAAAAAAAAAAAA----a = 2d
60060002
hook_configAAAAAAAAAAAAAAAAAA----a = 2e
BUG: unable to handle kernel NULL pointer dereference at 00000001
IP: [<f81018e8>] FindInsrcPortHashTable+0x8/0x140
*pdpt = 0000000033be3001 *pde = 000000011dad8067
Oops: 0000 [#1] SMP
last sysfs file: /sys/devices/virtual/block/dm-2/dm/name
...............
[<c07b06ff>] ? napi_skb_finish+0x2f/0x40
[<c07b0bd5>] ? napi_gro_receive+0x25/0x40
[<f8c1d95f>] ? e1000_clean_rx_irq+0x31f/0x450
[<f8c20058>] ? e1000e_poll+0x78/0x2b0
[<c07b1e8e>] ? net_rx_action+0xde/0x280
[<c04625ca>] ? __do_softirq+0x8a/0x1a0
[<c04c1861>] ? move_native_irq+0x11/0x50
[<c04b9fbe>] ? audit_syscall_entry+0x1be/0x1e0
[<c046271d>] ? do_softirq+0x3d/0x50
[<c0462875>] ? irq_exit+0x65/0x70
[<c040c250>] ? do_IRQ+0x50/0xc0
[<c0409f10>] ? common_interrupt+0x30/0x38
Code: 0f 97 c1 89 ce 0f 92 c1 89 f2 38 ca 0f 84 9c fe ff ff 8b 40 0c 85 c0 75 c2 31 c0 e9 e7 fe ff ff 8d 76 00 55 57 56 89 d6 53 89 c3 <0f> b6 48 01 0f b6 00 ba 67 66 66 66 01 c1 89 c8 f7 ea c1 fa 02
EIP: [<f81018e8>] FindInsrcPortHashTable+0x8/0x140 SS:ESP 0068:f1fa1b30
CR2: 0000000000000001
根据上面信息说BUG在0x000000001所以我就
crash> dis -l 00000001
dis: WARNING: 1: no associated kernel symbol found
0x1: Cannot access memory at address 0x1
但是没有发现
然后我在用了下面命令还是没有发现问题,请问可能是怎么回事呢?这个空指针引用到底会出现在哪里呢?(顺便说下我的是在透明桥上HOOK的,然后这个BUG只有在我把刚刚上网的机子端口连到透明桥一段才会出现)。
crash> l* FindInsrcPortHashTable+0x8
No symbol "FindInsrcPortHashTable" in current context.
gdb: gdb request failed: l* FindInsrcPortHashTable+0x8
回复 1# ierent168
hook_config1这个KO含这个符号。而这个符号crash工具没有加载。
自己把这个KO的汇编objdump出来看吧。
这个明摆着就是一个空指针访问。
BUG: unable to handle kernel NULL pointer dereference at 00000001
00000001是想访问的地址,而不是指令。 回复 2# Tinnal
对啊我用这句 crash> dis -l 0x00000001主要是想对0x00000001这个地址进行反汇编啊,
大哥,我不是已经说了吗。00000001是想访问的地址,而不是指令。,你还怎么对它反汇编呀!!!
这个地址要是存在,就不会蹦了。你还想反汇编,唉~~~
你应该反汇编的是FindInsrcPortHashTable+0x8/0x140!!!再结合崩溃时的寄存器以及栈去分析!!
如是对这种反向分析不熟(如果为真,不要追问,没人会答,no money no talk,你不会的可能性为99.9%)。就在FindInsrcPortHashTable这个函数里多打点信息,把每个指针,每个流程都打印一下,去正向分析,这是初学者比较能接受的方式。 呵呵,tinnal兄说的很对,应该对FindInsrcPortHashTable函数进行反汇编,然后结合代码分析。
从现象上看应该是hook_config1内核模块中代码编写问题,空指针,分析代码逻辑应该能找到原因。 回复 5# humjb_1983
根据您说的基本已经判断了出来,本来以为改好了 但是过了几天又突然死机还是报一样的错误,下面是部分代码,我后来加了一句红色部分,死机情况明显减少,但是最近又突然死了一次,而且发现报的错误一样的。位置也一样。我先说明下PortMidAddr只是一个保持地址信息的变量,我想将这个地址传递给指针变量ptl.现在报错还是
BUG: unable to handle kernel NULL pointer dereference at 00000001
IP: [<f81018e8>] FindInsrcPortHashTable+0x8/0x140
我想知道下该如何将地址信息传递给ptl才不会出现空指针引用呢?
int FindInsrcPortHashTable(UINT8 *data,UINT8 protocol)
{
UINT32 hv=hashPort(data);
srcPortFilter *ptl = NULL;
switch(protocol)
{
case 0x00:
if(PortMidAddr == 0)
{
return 0;
}
//主要作用是传递地址
ptl = (srcPortFilter *)PortMidAddr;
while(ptl)
{
if(!memcmp(ptl->srcPort,data,2))
return 1;
ptl=ptl->next;
}
return 0;
break;
} 回复 5# humjb_1983
我刚刚又用 objdump反汇编了下.ko文件,定位出来了是在 FindInsrcPortHashTable函数中调用hashport()函数时候出现错误了,但是根据我的分析这个错误又不可能会产生空指针的。
如下红色部分为根据opps信息定位到出错的地方,在C语言中对于语句是return (srcPort+srcPort)%srcPortFilt_HEAD_SIZE; 这句话主要是通过data指针将数据传递给srcPort[]数组
我之所以认为矛盾是因为,首先我的data指针不会传递空地址进去,而且数据包够长,也不会发生越界情况。
int FindInsrcPortHashTable(UINT8 *data,UINT8 protocol)
{
960: 55 push %ebp
961: 57 push %edi
962: 56 push %esi
963: 89 d6 mov %edx,%esi
965: 53 push %ebx
966: 89 c3 mov %eax,%ebx
//*****************************************************æo<90>Portå<9c>°å<9d><80>ç<9a><84>Hash表å<8c>1é<85><8d>é<83>¨å<88><86>*****************************************************//
UINT32 hashPort(UINT8 srcPort[])
{
return (srcPort+srcPort)%srcPortFilt_HEAD_SIZE;
968: 0f b6 48 01 movzbl 0x1(%eax),%ecx
96c: 0f b6 00 movzbl (%eax),%eax
96f: ba 67 66 66 66 mov $0x66666667,%edx
974: 01 c1 add %eax,%ecx
976: 89 c8 mov %ecx,%eax
978: f7 ea imul %edx
97a: c1 fa 02 sar $0x2,%edx
97d: 8d 14 92 lea (%edx,%edx,4),%edx
980: 01 d2 add %edx,%edx
982: 29 d1 sub %edx,%ecx
984: 89 ca mov %ecx,%edx
}
*/
// printk(KERN_EMERG "hook_config----PortMidAddr = %x\n",PortMidAddr);
switch(protocol)
986: 89 f1 mov %esi,%ecx
988: 80 f9 01 cmp $0x1,%cl
98b: 0f 84 8f 00 00 00 je a20 <FindInsrcPortHashTable+0xc0>
991: 72 1d jb 9b0 <FindInsrcPortHashTable+0x50>
993: 80 f9 02 cmp $0x2,%cl
996: 0f 84 c4 00 00 00 je a60 <FindInsrcPortHashTable+0x100>
99c: 80 f9 03 cmp $0x3,%cl
99f: 90 nop
9a0: 74 46 je 9e8 <FindInsrcPortHashTable+0x88>
{
return 0;
}
看起来像是传入的data指针不对,再确认下data的相关处理逻辑? 回复 8# humjb_1983
这次问题应该是解决了,就是对于特殊数据包不是TCP、的但是是IPV4的处理中指针地址没有处理,导致强制执行时候会出现指针引用错误问题。谢谢humjb_1983的帮助以及楼上的各位的帮助,还是知识积累不够 ,以及编程不规范造成这些问题的 ierent168 发表于 2014-09-11 11:05 static/image/common/back.gif
回复 8# humjb_1983
呵呵,问题解决就满足了。。。
页:
[1]