前一段時間學了一下,printk()列印語句,現在用起來又忘了,看了一下前一段時間做的筆記,不是很詳細,所以決定再寫一下和printk相關的除錯的東西。算是複習一下吧。
首先,先熟悉一下printk函式,這個函式和printf函式很類似。只不過乙個執行在使用者態,乙個執行在核心態。此外還是要熟悉一下終端,和控制台等幾個概念
首先需要說的是可以通過以下幾種途徑檢視printk()函式的列印資訊
1、直接在終端中使用dmesg命令來檢視 這個我自己試了一下這個裡面所有級別訊息的都能看見
2、檢視/var/log/messages 這個裡面除了最後乙個級別的其他級別的都能看見,7應該就是控制台級別。
3、檢視/proc/kmsg 這個試了一下,打不開呀,不知道為什麼
1、printk及控制台的日誌級別
printk是在核心中執行的像控制台輸出顯示的函式。核心會先在核心空間中分配一靜態緩衝區,作為顯示用的空間,然後呼叫sprintf,格式換顯示字串,最後呼叫tty_write函式向終端列印資訊。
#define kern_emerg 0/*緊急事件訊息,系統崩潰之前提示,表示系統不可用*/
#define kern_alert 1/*報告訊息,表示必須立即採取措施*/
#define kern_crit 2/*臨界條件,通常涉及嚴重的硬體或軟體操作失敗*/
#define kern_err 3/*錯誤條件,驅動程式常用kern_err來報告硬體的錯誤*/
#define kern_warning 4/*警告條件,對可能出現問題的情況進行警告*/
#define kern_notice 5/*正常但又重要的條件,用於提醒*/
#define kern_info 6/*提示資訊,如驅動程式啟動時,列印硬體資訊*/
#define kern_debug 7/*除錯級別的訊息*/
extern int console_printk;
#define console_loglevel (consle_printk[0])
#define default_message_loglevel (consle_printk[0])
#define minmum_console_loglevel (consle_printk[1])
#define default_console_loglevel(consle_printk[2])
在沒有指定日誌級別的情況下:printk語句採用的是級別是default_message_loglevel它的定義如下:
#define default_message_lgolevel4 /*其實通過這裡可以看的出來,這個級別是和警告條件的級別是一致的*/
為了更好的控制不同級別的資訊顯示在控制台上面,核心設定了控制台的日誌級別consle_loglevel,printk日誌級別的作用是列印一定級別的訊息,與之類似控制台值顯示一定級別的訊息。當日誌的級別小於console_loglevel時,訊息才能顯示出來。控制台日誌的級別定義如下:
#define minmum_consle_lgolevel1 /*這裡是可以使用的最小日誌的級別*/
#define default_consle_lgolevel7 /*比這個級別小的訊息都會列印出來 */
int consle[_printk[4]=
default_consle_lgolevel, /*控制台日誌級別*/
default_message_lgolevel , /*沒有定義級別的時候,這個是預設的值*/
minmum_consle_lgolevel ,/*最小的級別,也即是最高的級別*/
default_consle_lgolevel /*預設的控制台級別*/
通過讀寫/proc/sys/kernel/printk檔案可以讀取和修改控制台檔案的級別。方法
# cat /proc/sys/kernel/printk。
這上面顯示的4個資料分別對應控制台日誌級別、預設的訊息日誌級別、最低的控制台日誌級別、預設的控制台日誌級別\
用下面的命令來設定當前的日誌級別.
#echo 8 > /proc/sys/kernel/printk
實驗表明
(1)是否列印到messages 檔案和console_loglevel 無關,訊息重要性為kern_debug
7時不列印到messages 檔案,否則就列印。
(2)不管訊息重要性是否小於console_loglevel,只要重要性不為kern_emerg,就
不會列印到console,說明在gnome 圖形介面下訊息只會發到messages 檔案,一般是不會
到console 上的。(這個應該是在x-window下面的吧,要不就和上面的矛盾了)
linux裝置驅動程式除錯
一 寫linux裝置驅動程式最難的地方就是沒有強大的除錯工具,一般間接或者直接的除錯手段 1.利用printk 2.檢視oop訊息 3.利用strace 4.利用核心內建的hacking選項 5.利用ioctl方法 6.利用 proc檔案系統 7.使用kgdb 8.使用systemtap 二 1,利...
除錯裝置驅動程式
linux核心沒有整合對偵錯程式的支援。指令級的kdb kernel debudgger 核心偵錯程式 源 級偵錯程式kgdb kernel gnu debugger 核心gnu偵錯程式 udev 工作 1.核心中的sysfs支援,sysfs是linux裝置模型的重要組成部分。位於記憶體中,在啟動時...
linux裝置驅動程式 字元裝置驅動程式
先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...