Linux內(nèi)核調(diào)試printk()總結(jié)
來源:程序員人生 發(fā)布時(shí)間:2014-11-13 09:02:39 閱讀次數(shù):3260次
我們?cè)谑褂胮rintk()函數(shù)中使用日志級(jí)別為的是使編程人員在編程進(jìn)程中自定義地進(jìn)行信息的輸出,更加容易地掌握系統(tǒng)當(dāng)前的狀態(tài)。
對(duì)程序的調(diào)試起到了很重要的作用。
(下文中的日志級(jí)別和控制臺(tái)日志控制級(jí)別是1個(gè)意思)
printk(日志級(jí)別 "消息文本");這里的日志級(jí)別通俗的說指的是對(duì)文本信息的1種輸出范圍上的指定。
日志級(jí)別1共有8個(gè)級(jí)別,printk的日志級(jí)別定義以下(在linux26/includelinux/kernel.h中):
#defineKERN_EMERG"<0>"/*緊急事件消息,系統(tǒng)崩潰之條件示,表示系統(tǒng)不可用*/
#defineKERN_ALERT"<1>"/*報(bào)告消息,表示必須立即采取措施*/
#defineKERN_CRIT"<2>"/*臨界條件,通常觸及嚴(yán)重的硬件或軟件操作失敗*/
#defineKERN_ERR"<3>"/*毛病條件,驅(qū)動(dòng)程序經(jīng)常使用KERN_ERR來報(bào)告硬件的毛病*/
#defineKERN_WARNING"<4>"/*正告條件,對(duì)可能出現(xiàn)問題的情況進(jìn)行正告*/
#defineKERN_NOTICE"<5>"/*正常但又重要的條件,用于提示。經(jīng)常使用于與安全相干的消息*/
#defineKERN_INFO"<6>"/*提示信息,如驅(qū)動(dòng)程序啟動(dòng)時(shí),打印硬件信息*/
#defineKERN_DEBUG"<7>"/*調(diào)試級(jí)別的消息*/
沒有指定日志級(jí)別的printk語句默許采取的級(jí)別是 DEFAULT_ MESSAGE_LOGLEVEL(這個(gè)默許級(jí)別1般為<4>,即與KERN_WARNING在1個(gè)級(jí)別上),其定義在linux26/kernel/printk.c中可以找到。
下面是1個(gè)比較簡(jiǎn)單的使用
printk(KERN_INFO "INFO
"); //這里可使用數(shù)字代替 KERN_INFO,便可以寫成printk(<6> "INFO
");
在這個(gè)格式的定義中,日志級(jí)別和信息文本之間不能夠使用逗號(hào)隔開,由于系統(tǒng)在進(jìn)行編譯的時(shí)候,將日志級(jí)別轉(zhuǎn)換成字符串于后面的文本信息進(jìn)行連接。
在對(duì)系統(tǒng)輸出進(jìn)行控制時(shí),主要是討論控制臺(tái)和偽終真?zhèn)€輸情況,和系統(tǒng)日志等。
下面是控制臺(tái)日志級(jí)別的1些扼要的介紹
控制臺(tái)相應(yīng)的日志級(jí)別定義以下:
#define MINIMUM_CONSOLE_LOGLEVEL 1 /*可使用的最小日志級(jí)別*/
#define DEFAULT_CONSOLE_LOGLEVEL 7 /*比KERN_DEBUG 更重要的消息都被打印*/
int console_printk[4] = {
DEFAULT_CONSOLE_LOGLEVEL,/*控制臺(tái)日志級(jí)別,優(yōu)先級(jí)高于該值的消息將在控制臺(tái)顯示*/
/*默許消息日志級(jí)別,printk沒定義優(yōu)先級(jí)時(shí),打印這個(gè)優(yōu)先級(jí)以上的消息*/
DEFAULT_MESSAGE_LOGLEVEL,
/*最小控制臺(tái)日志級(jí)別,控制臺(tái)日志級(jí)別可被設(shè)置的最小值(最高優(yōu)先級(jí))*/
MINIMUM_CONSOLE_LOGLEVEL,
DEFAULT_CONSOLE_LOGLEVEL,/* 默許的控制臺(tái)日志級(jí)別*/
};
在進(jìn)行查看的時(shí)候,可使用命令 cat /proc/sys/kernel/printk來查看這4個(gè)值
可以通過修改文件/proc/sys/kernel/printk中的第1個(gè)值來更改當(dāng)前的控制臺(tái)日志級(jí)別。
(聲明:在下面的模塊函數(shù)中控制臺(tái)所使用的日志級(jí)別均為KERN_WARNING級(jí)別)當(dāng)日志級(jí)別高于console_loglevel(控制臺(tái)日志級(jí)別)時(shí),消息才能在控制臺(tái)顯示出來。
假設(shè)我們寫了1個(gè)以下的模塊函數(shù):
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);
在控制臺(tái)(這里指的是虛擬終端 Ctrl+Alt+(F1~F6))加載模塊以后,控制臺(tái)給出的信息為
6~9行中要求輸出的信息,我們?cè)趥谓K端(如果對(duì)偽終端不是很清楚可以看相干的內(nèi)容)上運(yùn)行命令tail -n 10 /var/log/messages查看日志文件剛才得到的運(yùn)行記錄
可以發(fā)現(xiàn)messages中的值為KERN_WARNING級(jí)別以后所要求輸出到信息值。而如果我們?cè)谖募yslog和kern-log中查看系統(tǒng)日志文件,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
(不過在有些機(jī)器上運(yùn)行得到的結(jié)果其實(shí)不是這樣的)
即1般情況下,syslog和kern.log兩個(gè)文件中記錄的內(nèi)容從編程這個(gè)角度來看是基本1致的。
在目錄/var/log/下有1下4個(gè)文件可以查看日志
syslog ,kern.log,messages ,DEBUG 。
syslog和kern.log1般情況下可以得到所有的系統(tǒng)輸出值,而messages得到的是比控制臺(tái)日志級(jí)別低的輸出值,DEBUG得到的僅僅是DEBUG級(jí)別的
輸出值。
1般情況下,優(yōu)先級(jí)高于控制臺(tái)日志級(jí)別的消息將被打印到控制臺(tái)。優(yōu)先級(jí)低于控制臺(tái)日志級(jí)別的消息將被打印到messages日志文件中,而在偽終端下不打印任何的信息。
我們?cè)谶M(jìn)行有關(guān)編程的時(shí)候,若使用到printk()這個(gè)函數(shù),1般查看信息是在messages和虛擬終端下進(jìn)行查看,而對(duì)syslog和kern.log下是用來檢驗(yàn)所有信息的輸出情況。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)