歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核異常

Linux內核異常

日期:2017/3/1 10:05:18   编辑:Linux內核

內核級的程序,總有死機的時候,如果運氣好,會看到一些所謂“Oops”信息(在屏幕上或系統日志中)

比如:

Unable to handle kernel paging request at virtual address f899b670

printing eip:

c01de48c

*pde = 00737067

Oops: 0002 [#1]

Modules linked in: bluesmoke_e752x bluesmoke_mc md5 ipv6 parport_pc

lp parport nls_cp936 vfat fat dm_mod button battery asus_acpi ac joydev

CPU: 0

EIP: 0060:[] Not tainted VLI

EFLAGS: 00210286 (2.6.9-11.21AXKProbes)

EIP is at kobject_add+0x83/0xd7

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

Oops 可以看成是內核級的Segmentation Fault。應用程序如果進行了非法內存訪問或執行了非法指令,會得到Segfault信號,一般的行為是coredump,應用程序也可以自己截獲Segfault信號,自行處理。如果內核自己犯了這樣的錯誤,則會打出Oops信息。

Oops異常分析:編寫內核模塊,產生內核異常,根據OOPS分析異常原因

異常代碼:

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/init.h>

void D(void)

{

int *p = NULL;

int a = 6;

printk("Function D\n");

*p = a+5;

}

void C(void)

{

printk("Function C\n");

D();

}

void B(void)

{

printk("Function B\n");

C();

}

void A(void)

{

printk("Function A\n");

B();

}

int oops_init(void)

{

printk("oops init\n");

A();

return 0;

}

void oops_exit(void)

{

printk("oops exit!\n");

}

module_init(oops_init);

module_exit(oops_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("David Xie");

1、編譯加載模塊

2、加載模塊時出現了oops錯誤信息

3、分析錯誤原因:“Unable to handle kernel NULL pointer dereference at vitual address 00000000” 說明了出錯原因是對空指針的非法訪問

4、找到出錯位置:”PC is at D+0x1c/0x28[oops]”說明出錯的位置位於D函數偏移的0x1c處。

5、反匯編找到出錯位置

# objdump –D –S oops.ko > log

如果在編譯過程中加上選項”-g”調試選項就可以看到相對應的C語言代碼,就很容易找到問題所在

加上調試選項: 在內核中Makefile文件中使”-g”使能

Copyright © Linux教程網 All Rights Reserved