设为首页 加入收藏

TOP

定位可动态加载的内核模块的OOPS代码行
2014-11-24 02:22:42 来源: 作者: 【 】 浏览:1
Tags:定位 动态 加载 内核 模块 OOPS 代码

1. 从vmlinux获取具体的代码行
文章中albcamus版主也提到了,需要有自己编译的vmlinux,而且编译时打开compile with debug info. 这个选项打开之后会使vmlinux文件比不加调试信息大一些。我这里代调试信息的是49M。建议如果学习的时候,想使用gdb的方式获取出错代码行的 话,就加上这个编译条件。


然后就可以按照具体的方法去操作,可以定位到具体的C 代码行。


2. 从自己编译的内核模块出错信息中获取代码行
ldd3中提供的misc-modules/faulty.c为例。主要以faulty_write函数作分析。
1)由于作者提供的函数代码就一样,过于简单,我这里简单加上一些代码(也就是判断和赋值),如下:


ssize_t faulty_write (struct file *filp, const char __user *buf, size_t count,
loff_t *pos)
{
/* make a simple fault by dereferencing a NULL pointer */
if(count > 0x100)
count = 0x100;
*(int *)0 = 0;
return count;
}


2)编译该模块,并且mknod /dev/faulty
3)向该模块写入数据:echo 1 > /dev/faulty, 内核OOPS,信息如下:


<1>BUG: unable to handle kernel NULL pointer dereference at virtual address 00000000
printing eip:
f8e8000e
*pde = 00000000
Oops: 0002 [#3]
SMP
Modules linked in: faulty autofs4 hidp rfcomm l2cap ...... //
此处省略若干字符
CPU: 1
EIP: 0060:[] Not tainted VLI
EFLAGS: 00010283 ( 2.6.18 .3 #2)
EIP is at faulty_write+0xe/0x19 [faulty]
eax: 00000001 ebx: f 4f 6ca40 ecx: 00000001 edx: b 7c 2d000
esi: f8e80000 edi: b 7c 2d000 ebp: 00000001 esp: f4dc 5f 84
ds: 007b es: 007b ss: 0068
Process bash (pid: 6084, ti=f4dc5000 task=f 7c 8d4d0 task.ti=f4dc5000)
Stack: c 1065914 f 4dc5fa 4 f 4f 6ca40 fffffff7 b 7c 2d 000 f 4dc 5000 c 1065f 06 f 4dc5fa4
00000000 00000000 00000000 00000001 00000001 c 1003d0b 00000001 b 7c 2d000
00000001 00000001 b 7c 2d000 bfd40aa8 ffffffda 0000007b c100007b 00000004
Call Trace:
[] vfs_write+0xa1/0x143
[ 1065f 06>] sys_write+0x 3c /0x63
[] syscall_call+0x7/0xb
Code: Bad EIP value.
EIP: [] faulty_write+0xe/0x19 [faulty] SS:ESP 0068:f4dc 5f 84


其中,我们应该关注的信息是第一行红色标出部分:告诉我们操作了NULL指针。其次,就是第二行红色部分:EIP is at faulty_write+0xe/0x19。这个出错信息告诉我们EIP指针出现问题的地方时faulty_write函数,而且指出了是faulty 模块。


同时,faulty_write+0xe/0x19的后半部分0xe/0x19,说明该函数的大小时0x019,出错位置是在0x0e。这两个值应该值得都是汇编代码的值。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Ubuntu编译程序新手指导 下一篇Linux信号量编程实例

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: