Linux內核調試printk()總結
來源:程序員人生 發布時間:2014-11-13 09:02:39 閱讀次數:3254次
我們在使用printk()函數中使用日志級別為的是使編程人員在編程進程中自定義地進行信息的輸出,更加容易地掌握系統當前的狀態。
對程序的調試起到了很重要的作用。
(下文中的日志級別和控制臺日志控制級別是1個意思)
printk(日志級別 "消息文本");這里的日志級別通俗的說指的是對文本信息的1種輸出范圍上的指定。
日志級別1共有8個級別,printk的日志級別定義以下(在linux26/includelinux/kernel.h中):
#defineKERN_EMERG"<0>"/*緊急事件消息,系統崩潰之條件示,表示系統不可用*/
#defineKERN_ALERT"<1>"/*報告消息,表示必須立即采取措施*/
#defineKERN_CRIT"<2>"/*臨界條件,通常觸及嚴重的硬件或軟件操作失敗*/
#defineKERN_ERR"<3>"/*毛病條件,驅動程序經常使用KERN_ERR來報告硬件的毛病*/
#defineKERN_WARNING"<4>"/*正告條件,對可能出現問題的情況進行正告*/
#defineKERN_NOTICE"<5>"/*正常但又重要的條件,用于提示。經常使用于與安全相干的消息*/
#defineKERN_INFO"<6>"/*提示信息,如驅動程序啟動時,打印硬件信息*/
#defineKERN_DEBUG"<7>"/*調試級別的消息*/
沒有指定日志級別的printk語句默許采取的級別是 DEFAULT_ MESSAGE_LOGLEVEL(這個默許級別1般為<4>,即與KERN_WARNING在1個級別上),其定義在linux26/kernel/printk.c中可以找到。
下面是1個比較簡單的使用
printk(KERN_INFO "INFO
"); //這里可使用數字代替 KERN_INFO,便可以寫成printk(<6> "INFO
");
在這個格式的定義中,日志級別和信息文本之間不能夠使用逗號隔開,由于系統在進行編譯的時候,將日志級別轉換成字符串于后面的文本信息進行連接。
在對系統輸出進行控制時,主要是討論控制臺和偽終真個輸情況,和系統日志等。
下面是控制臺日志級別的1些扼要的介紹
控制臺相應的日志級別定義以下:
#define MINIMUM_CONSOLE_LOGLEVEL 1 /*可使用的最小日志級別*/
#define DEFAULT_CONSOLE_LOGLEVEL 7 /*比KERN_DEBUG 更重要的消息都被打印*/
int console_printk[4] = {
DEFAULT_CONSOLE_LOGLEVEL,/*控制臺日志級別,優先級高于該值的消息將在控制臺顯示*/
/*默許消息日志級別,printk沒定義優先級時,打印這個優先級以上的消息*/
DEFAULT_MESSAGE_LOGLEVEL,
/*最小控制臺日志級別,控制臺日志級別可被設置的最小值(最高優先級)*/
MINIMUM_CONSOLE_LOGLEVEL,
DEFAULT_CONSOLE_LOGLEVEL,/* 默許的控制臺日志級別*/
};
在進行查看的時候,可使用命令 cat /proc/sys/kernel/printk來查看這4個值
可以通過修改文件/proc/sys/kernel/printk中的第1個值來更改當前的控制臺日志級別。
(聲明:在下面的模塊函數中控制臺所使用的日志級別均為KERN_WARNING級別)當日志級別高于console_loglevel(控制臺日志級別)時,消息才能在控制臺顯示出來。
假設我們寫了1個以下的模塊函數:
1 #include <linux/init.h>
2 #include <linux/module.h>
3 MODULE_LICENSE("Dual BSD/GPL");
4 static int book_init(void)
5 {
6 printk(KERN_EMERG "EMERG
");
7 printk(KERN_ALERT "ALERT
");
8 printk(KERN_CRIT " CRIT
");
9 printk(KERN_ERR " ERR
");
10 printk(KERN_WARNING ""WARNING
");
11 printk(KERN_NOTICE "NOTICE
");
12 printk(KERN_INFO "INFO
");
13 printk(KERN_DEBUG "DEBUG
");
14 return 0;
}
15static void book_exit(void)
16{
17 printk(KERN_ALERT "Book module exit
");
}
18 module_init(book_init);
19 module_exit(book_exit);
在控制臺(這里指的是虛擬終端 Ctrl+Alt+(F1~F6))加載模塊以后,控制臺給出的信息為
6~9行中要求輸出的信息,我們在偽終端(如果對偽終端不是很清楚可以看相干的內容)上運行命令tail -n 10 /var/log/messages查看日志文件剛才得到的運行記錄
可以發現messages中的值為KERN_WARNING級別以后所要求輸出到信息值。而如果我們在文件syslog和kern-log中查看系統日志文件,1般情況下可以得到所有的輸出信息
Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637057] INFO
Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637063] CRIT
Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637066] WARNING
Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637068] ERR
Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637069] ALERT
Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637070] EMERG
Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637071] NOTICE
Jul 18 11:44:19 xiyoulinux-desktop kernel: [16100.637072] DEBUG
(不過在有些機器上運行得到的結果其實不是這樣的)
即1般情況下,syslog和kern.log兩個文件中記錄的內容從編程這個角度來看是基本1致的。
在目錄/var/log/下有1下4個文件可以查看日志
syslog ,kern.log,messages ,DEBUG 。
syslog和kern.log1般情況下可以得到所有的系統輸出值,而messages得到的是比控制臺日志級別低的輸出值,DEBUG得到的僅僅是DEBUG級別的
輸出值。
1般情況下,優先級高于控制臺日志級別的消息將被打印到控制臺。優先級低于控制臺日志級別的消息將被打印到messages日志文件中,而在偽終端下不打印任何的信息。
我們在進行有關編程的時候,若使用到printk()這個函數,1般查看信息是在messages和虛擬終端下進行查看,而對syslog和kern.log下是用來檢驗所有信息的輸出情況。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈