printk 核心除錯 訊息級別

2021-06-16 13:11:55 字數 2571 閱讀 6658

核心除錯相比於使用者程式除錯難度就要大很多。

linux 是 c 語言寫的,但不能使用 printf 來列印,原因很容易解釋,核心中不認識庫

檔案中的 printf 函式。

最普通的除錯技術是監視,即在應用程式中的適當地方呼叫 printf 顯示監視資訊,這

是針對普通應用程式而言,對於 linux 核心則是通過 printk 來完成相應工作,函式 printk 的

使用方法和 printf 相似。

1、訊息優先順序(loglevel)

printk 根據日誌級別(loglevel)對訊息進行分類。

日誌級別用巨集定義,日誌級別巨集展開為乙個字串,在編譯時由預處理器將它和訊息

文字拼接成乙個字串,因此 printk 函式中日誌級別巨集和格式字串間不能有逗號。

printk 的日誌級別定義如下(在 include/linux/printk.h 中):

#define kern_emerg "<0>" /*緊急事件訊息,系統崩潰之前提示,表示系統不可用*/

#define kern_alert "<1>" /*報告訊息,表示必須立即採取措施*/

#define kern_crit "<2>" /*臨界條件,通常涉及嚴重的硬體或軟體操作失敗*/

#define kern_err "<3>" /*錯誤條件,驅動程式常用 kern_err 來報告硬體的錯誤*/

#define kern_warning "<4>" /*警告條件,對可能出現問題的情況進行警告*/

#define kern_info "<6>" /*提示資訊,如驅動程式啟動時,列印硬體資訊*/

#define kern_debug "<7>" /*除錯級別的訊息*/

日誌級別的範圍是 0~7,沒有指定日誌級別的 printk 語句預設採用的級別是

default_ message_loglevel,其定義列出如下:

/*沒有定義日誌級別的 printk 使用下面的預設級別*/

#define default_message_loglevel 4

/* kern_warning 警告條件*/

核心設定了控制台的日誌級別 console_loglevel。printk 日誌級別的作用是列印一定級別

的訊息,與之類似,控制台只顯示一定級別的訊息。當日誌級別小於 console_loglevel 時,

訊息才能顯示出來。控制台相應的日誌級別定義如下:

/* 顯示比這個級別更重發的訊息*/

#define minimum_console_loglevel  1   /*可以使用的最小日誌級別*/

#define default_console_loglevel   7

/*比 kern_debug 更重要的訊息都被列印*/

int console_printk[4] = ;

通過讀寫/proc/sys/kernel/printk 檔案可讀取和修改控制台的日誌級別。檢視這個檔案的

方法如下:

#cat /proc/sys/kernel/printk

6 4 1 7

上面顯示的 4 個資料分別對應控制台日誌級別、預設的訊息日誌級別、最低的控制台日

志級別和預設的控制台日誌級別。

可用下面的命令設定當前日誌級別:

# echo 8 > /proc/sys/kernel/printk

通常,選用 kern_info 和 kern_debug 作為除錯級別。

2、示例

printk(kern_info "resume: load_image: ret = %d.\n", ret);

printk(kern_info "resume:test output the point %p\n", ptr);

注意:在 kern_debug、 kern_info 和後面的輸出語句之間沒有逗號!

3、檢視核心輸出

在核心中,函式 printk 將訊息列印到環形緩衝區__log_buf 中,並將訊息傳給控制台進

行顯示。控制台驅動程式根據控制台的日誌級別顯示日誌訊息。

如果系統同時執行 klogd 和 syslogd,則無論 console_loglevel 為何值,核心訊息都會追

加到/var/log/messages 中(否則按 syslogd 的配置處理)。如果 klogd 沒有執行,則這些訊息

不會傳遞至使用者空間,這時只能檢視/proc/kmsg 檔案(使用 dmesg 命令即可)

實際使用過程中,通過 dmesg 資訊可以獲取核心輸出的訊息:

dmesg > ***xx.log

#將核心訊息輸出到檔案中

另外,通過訪問/var/log/messages 檔案,可以檢視核心輸出的訊息,並且會保留多次的內容。

4、核心訊息解析

使用「/usr/src/linux-headers-3.2.0-32/scripts」下的 show_delta 指令碼,可以將 dmseg.log 內

容進行再整理,生成可顯示開機時間段的文件。

/usr/src/linux-headers-3.2.0-32-generic/scripts/show_delta ***x.log > ***x-time.log

同事wiki 帖出來 方便檢視

核心開發除錯printk

在進行驅動開發的過程中往往要列印一些資訊來檢視是否正確類似於printf,以下將介紹在核心開發常用的除錯方法。第一次寫文章,內容可能不咋樣勿噴呀 一 printk介紹 二 如何檢視並修改訊息級別 在應用程式採用printf列印除錯 核心驅動採用printk列印除錯。printk函式列印資料到cons...

核心printk日誌資訊的級別

日誌級別一共有8個級別,printk的日誌級別定義如下 在include linux kernel.h中 define kern emerg 0 緊急事件訊息,系統崩潰之前提示,表示系統不可用 define kern alert 1 報告訊息,表示必須立即採取措施 define kern crit ...

調整核心printk的列印級別

有時除錯核心模組,列印資訊太多了,可以通過修改 proc sys kernel printk檔案內容來控制。預設設定是6 4 1 7 cat proc sys kernel printk 7 4 1 7 該檔案有四個數字值,它們根據日誌記錄訊息的重要性,定義將其傳送到何處。關於不同日誌級別的更多資訊...