在進行驅動開發的過程中往往要列印一些資訊來檢視是否正確類似於printf,以下將介紹在核心開發常用的除錯方法。.(第一次寫文章,內容可能不咋樣勿噴呀)
一、printk介紹
二、如何檢視並修改訊息級別
在應用程式採用printf列印除錯、核心驅動採用printk列印除錯。
printk函式列印資料到console緩衝區,列印的格式方類似printf。
printk函式說明
標頭檔案:
int printk(kern_*** const char *fmt , …)例子:@param[in] fmt 格式化引數,如:%d
@return 列印出來的字元個數
printk(「hello_init\n」);優先順序列印級別 0最高,7最低printk(「hello_init = %d\n」,i);
printk(kern_alert"hello_init=%d\n",i);
printk("<1>"「hello_init=%d」,i);
kern_alert 等效於「<1>」
通過修改kern_alert來修改優先順序
0、kern_emerg 「<0>」用於緊急訊息, 常常是那些崩潰前的訊息
1、kern_alert 「<1>」需要立刻動作的情形
2、kern_crit 「<2>」嚴重情況, 常常與嚴重的硬體或者軟體失效有關
3、kern_err 「<3>」用來報告錯誤情況; 裝置驅動常常使用 kern_err 來報告硬體故障
4、kern_warning 「<4>」有問題的情況的警告, 這些情況自己不會引起系統的嚴重問題
5、kern_notice 「<5>」正常情況, 但是仍然值得注意. 在這個級別一些安全相關的情況會報告
6、kern_info 「<6>」資訊型訊息. 在這個級別, 很多驅動在啟動時列印它們發現的硬體的資訊
7、kern_debug 「<7>」用作除錯訊息
格式化符
符合說明
%d十進位制列印
%x十六進製制
%u無符號整數
%lu無符號長整數
%lx十六進製制無符號長整數
%lld
64bit整數值
%llx
64bit16進製制整數值
%zusize_t 10進製列印
%zxsize_t 16進製制列印
%zdssize_t 10進製列印
%p指標原值輸出
日誌守護程序
【klogd&syslogd】
klogd 核心日誌守護程序,將核心訊息放入/var/log/messages中
syslogd 系統日誌守護程序,將程式訊息放入/var/log/messages中
通過命令#dmesg可以檢視訊息
也可以通過命令cat /var/log/messages檢視訊息
【console_loglevel】
if (列印訊息級別 < console_loglevel)
列印到當前控制台
可以通過讀/proc/sys/kernel/printk來檢視控制台訊息級別
如,#cat /proc/sys/kernel/printk出現4 4 1 7
該檔案有四個數字值,它們根據日誌記錄訊息的重要性,定義將其傳送到何處。上面顯示的4個資料分別對應:
1、控制台日誌級別:優先順序高於該值的訊息將被列印至控制台
2、預設的訊息日誌級別:將用該優先順序來列印沒有優先順序的訊息(未指定日誌級別的printk() 採用的預設級別 )
3、最低的控制台日誌級別:控制台日誌級別可被設定的最小值(最高優先順序)
4、預設的控制台日誌級別:控制台日誌級別的預設值
可以通過寫 /proc/sys/kernel/printk 來修改控制台訊息級別
了解了上面的這些知識後,我們就應該知道如何手動控制printk列印了。
例如,我想遮蔽掉所有的核心printk列印,那麼我只需要把第乙個數值調到最小值1或者0。
方法一:…寫得很亂#echo 1 4 1 7 > /proc/sys/kernel/printk
方法二:
#klogd -c 1
printk 核心除錯 訊息級別
核心除錯相比於使用者程式除錯難度就要大很多。linux 是 c 語言寫的,但不能使用 printf 來列印,原因很容易解釋,核心中不認識庫 檔案中的 printf 函式。最普通的除錯技術是監視,即在應用程式中的適當地方呼叫 printf 顯示監視資訊,這 是針對普通應用程式而言,對於 linux 核...
Linux核心的列印除錯printk
printk和printf在用法上的區別在於printk可以通過附加不同的日誌級別 loglevel 訊息優先順序 通過設定日誌的輸出級別來過濾列印在控制台上的訊息。linux核心中將日誌級別分成八個級別,分別為 kern emerg 用於緊急事件,一般是系統崩潰之前的提示訊息,核心拓展數字為 0 ...
驅動除錯之printk
閱讀過linux核心原始碼的童鞋肯定知道,核心有很多呼叫printk函式列印的除錯資訊。但是在核心啟動的時候,這些除錯資訊是預設不會列印出來的,需要啟動之後呼叫dmesg命令才能檢視到核心的列印資訊,即便這樣,我們還是不能檢視到完整的核心列印資訊,這是為什麼呢?下面我們要引入printk的級別 1....