1. 程式人生 > >核心(包括驅動)除錯技術。

核心(包括驅動)除錯技術。

最容易理解和使用最廣泛的printk();

define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */

所以 printk() 可以這樣用:printk(KERN_INFO "Hello, world!\n");。

未指定日誌級別的 printk() 採用的預設級別是 DEFAULT_MESSAGE_LOGLEVEL,這個巨集在 kernel/printk.c 中被定義為整數 4,即對應KERN_WARNING。

在 /proc/sys/kernel/printk 會顯示4個數值(可由 echo 修改),分別表示當前控制檯日誌級別、未明確指定日誌級別的預設訊息日誌級別、最小(最高)允許設定的控制檯日誌級別、引導時預設的日誌級別。當 printk() 中的訊息日誌級別小於當前控制檯日誌級別時,printk 的資訊(要有\n符)就會在控制檯上顯示。但無論當前控制檯日誌級別是何值,通過 /proc/kmsg (或使用dmesg)總能檢視。另外如果配置好並運行了 syslogd 或 klogd,沒有在控制檯上顯示的 printk 的資訊也會追加到 /var/log/messages.log 中。

char myname[] = "chinacodec\n";
printk(KERN_INFO "Hello, world %s!\n", myname);

系統系統自帶的資訊syslogd

(1)使用syslog()函式可以讓一般的Application將message紀錄到
/var/log/messages中, 但是syslogd必須要啟動, 否則訊息不會被寫入/var/log/messages中.

(2)使用printk()函式可以讓Kernel Module把訊息紀錄到/var/log/messages中,
但是syslogd和klogd都必須先啟動, 否則訊息不會被寫入/var/log/messages中.

KGDB

待續。。。