前言:
做Linux驅(qū)動(dòng)開(kāi)發(fā)或內(nèi)核調(diào)試的朋友,一定對(duì)printk不陌生,但你真的會(huì)用它嗎?為什么同樣是調(diào)試RK3588內(nèi)核,別人能精準(zhǔn)捕捉關(guān)鍵錯(cuò)誤,你卻被海量日志淹沒(méi)?今天就帶大家吃透printk的日志等級(jí)機(jī)制,從參數(shù)配置到實(shí)戰(zhàn)用法一次講透~
一、printk與printf的差異
用戶態(tài)的printf大家都熟,直接打印內(nèi)容,簡(jiǎn)單粗暴。但內(nèi)核場(chǎng)景更復(fù)雜,系統(tǒng)崩潰或是debug調(diào)試細(xì)節(jié),不同信息的重要性天差地別。如果所有日志一鍋端,關(guān)鍵錯(cuò)誤就容易被淹沒(méi)。
printk的核心就是給日志加了"優(yōu)先級(jí)標(biāo)簽",解決兩個(gè)核心問(wèn)題:
控制輸出渠道
只有日志等級(jí)≥內(nèi)核“控制臺(tái)日志級(jí)別”時(shí),才會(huì)實(shí)時(shí)打印到控制臺(tái)(串口/終端);否則僅存入內(nèi)核緩沖區(qū)(需用dmesg查看)。
區(qū)分信息重要性
從致命崩潰到調(diào)試細(xì)節(jié),8個(gè)等級(jí)可以快速定位關(guān)鍵問(wèn)題,比如優(yōu)先關(guān)注錯(cuò)誤級(jí)日志,忽略調(diào)試級(jí)冗余信息。
例如眺望電子RK3588 Linux6.1內(nèi)核在中定義了8個(gè)標(biāo)準(zhǔn)輸出等級(jí),數(shù)值 0~7,數(shù)值越小優(yōu)先級(jí)越高(0級(jí)為系統(tǒng)崩潰級(jí),7級(jí)為調(diào)試級(jí))。每個(gè)等級(jí)都有明確的使用場(chǎng)景,對(duì)應(yīng)關(guān)系如下:
等級(jí)宏 | 數(shù)值 | 英文含義 | 中文說(shuō)明 | 典型場(chǎng)景 |
KERN_EMERG | 0 | system is unusable | 緊急情況(系統(tǒng)不可用) | 內(nèi)核崩潰、致命硬件錯(cuò)誤 |
KERN_ALERT | 1 | 必須立即處理的警報(bào) | 關(guān)鍵資源耗盡、權(quán)限驗(yàn)證失敗 | |
KERN_CRIT | 2 | critical conditions | 嚴(yán)重錯(cuò)誤 | 文件系統(tǒng)損壞、進(jìn)程調(diào)度異常 |
KERN_ERR | 3 | error conditions | 普通錯(cuò)誤 | 驅(qū)動(dòng)初始化失敗、函數(shù)調(diào)用關(guān)鍵錯(cuò)誤 |
KERN_WARNING | 4 | warning conditions | 警告(潛在問(wèn)題) | 參數(shù)非法、內(nèi)存分配警告 |
KERN_NOTICE | 5 | normal but significant condition | 通知(重要正常事件) | 模塊加載/卸載、系統(tǒng)啟動(dòng)關(guān)鍵步驟 |
KERN_INFO | 6 | informational | 信息性消息 | 驅(qū)動(dòng)版本、硬件探測(cè)結(jié)果 |
KERN_DEBUG | 7 | debug-level messages | 調(diào)試消息 | 開(kāi)發(fā)者調(diào)試 |
二、4個(gè)printk核心參數(shù)
終端執(zhí)行以下指令:
cat/proc/sys/kernel/printk
這串?dāng)?shù)字不是隨機(jī)的,而是內(nèi)核日志系統(tǒng)的“核心配置開(kāi)關(guān)”,它直接決定了printk的日志輸出行為。輸出的4 4 1 7,這 4 個(gè)參數(shù)順序固定,分別對(duì)應(yīng)內(nèi)核日志的4個(gè)核心配置。
控制臺(tái)日志級(jí)別:4
這決定了哪些日志會(huì)實(shí)時(shí)輸出到控制臺(tái)。當(dāng)日志等級(jí)≤該值時(shí),直接打印到控制臺(tái),數(shù)值越大,輸出越全。
默認(rèn)消息日志級(jí)別:4
當(dāng)printk未顯式指定等級(jí)時(shí),自動(dòng)使用的默認(rèn)等級(jí)。
最小控制臺(tái)日志級(jí)別:1
限制控制臺(tái)日志級(jí)別的最低值,避免誤操作將級(jí)別設(shè)為0,導(dǎo)致遺漏關(guān)鍵日志。
默認(rèn)控制臺(tái)日志級(jí)別:7
內(nèi)核啟動(dòng)時(shí)的默認(rèn)控制臺(tái)級(jí)別,也作為重置參考值。
三、日志級(jí)別配置
根據(jù)場(chǎng)景調(diào)整日志級(jí)別,給大家分享如下兩種配置方法:
3.1臨時(shí)修改
想看到所有日志(包括調(diào)試信息):echo 7 > /proc/sys/kernel/printk
只看錯(cuò)誤及以上(過(guò)濾無(wú)關(guān)信息):echo 3 > /proc/sys/kernel/printk(僅顯示0~3級(jí))
恢復(fù)默認(rèn)配置:echo 4 4 1 7 > /proc/sys/kernel/printk
3.2永久修改
臨時(shí)修改重啟就沒(méi)了,永久修改需寫(xiě)入配置文件/etc/sysctl.conf:
1. 編輯/etc/sysctl.conf,添加一行:kernel.printk = 4 4 1 7(數(shù)值可按需調(diào)整)
2. 執(zhí)行sysctl -p,讓配置立即生效
四、日志查看技巧
實(shí)時(shí)查看控制臺(tái)日志
直接在終端觀察,僅顯示符合級(jí)別要求的日志。
查看內(nèi)核緩沖區(qū)日志
dmesg指令可以顯示所有等級(jí)日志,包括未輸出到控制臺(tái)的,搭配過(guò)濾更高效:dmesg |grep"ERR" # 篩選錯(cuò)誤級(jí)日志dmesg -w # 實(shí)時(shí)監(jiān)控日志
查看持久化日志文件
多數(shù)linux系統(tǒng)發(fā)行版會(huì)將內(nèi)核日志寫(xiě)入/var/log/kern.log,可用tail實(shí)時(shí)跟蹤:

五、printk正確用法
5.1基本語(yǔ)法
#include
5.2避坑事項(xiàng)
別濫用KERN_DEBUG:調(diào)試完成后一定要?jiǎng)h除或注釋?zhuān)駝t會(huì)占用內(nèi)核緩沖區(qū),影響系統(tǒng)性能;
關(guān)鍵錯(cuò)誤用高等級(jí):比如驅(qū)動(dòng)加載失敗、硬件異常,必須用KERN_ERR(3級(jí)),而不是KERN_INFO(6級(jí)),避免被過(guò)濾;
六、總結(jié)
printk輸出等級(jí)是Linux內(nèi)核日志的優(yōu)先級(jí)管理系統(tǒng),8個(gè)等級(jí)+ 4個(gè)核心參數(shù)共同決定了日志的輸出行為。
核心邏輯如下:數(shù)值越小,優(yōu)先級(jí)越高;控制臺(tái)日志級(jí)別≥日志等級(jí)時(shí),才會(huì)實(shí)時(shí)輸出;調(diào)試用KERN_DEBUG+級(jí)別7,生產(chǎn)環(huán)境用KERN_ERR+級(jí)別3~4。
掌握了printk的日志級(jí)別機(jī)制,不管是內(nèi)核調(diào)試還是驅(qū)動(dòng)開(kāi)發(fā),都能精準(zhǔn)定位問(wèn)題。下次遇到內(nèi)核相關(guān)的排障需求,不妨試試這些技巧,效率絕對(duì)翻倍~
如果覺(jué)得有用,記得點(diǎn)贊收藏并關(guān)注我們公眾號(hào),轉(zhuǎn)發(fā)給身邊做Linux開(kāi)發(fā)的朋友!
-
驅(qū)動(dòng)開(kāi)發(fā)
+關(guān)注
關(guān)注
0文章
140瀏覽量
12625 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
321瀏覽量
23194 -
RK3588
+關(guān)注
關(guān)注
8文章
555瀏覽量
7314
發(fā)布評(píng)論請(qǐng)先 登錄
Linux內(nèi)核學(xué)習(xí)筆記:printk調(diào)試
Linux內(nèi)核調(diào)試方法的總結(jié)
linux內(nèi)核打印函數(shù)printk的方法
Linux內(nèi)核模塊介紹,使用Linux模塊的優(yōu)點(diǎn)
如何配置和使用Linux內(nèi)核printk功能
內(nèi)核日志及printk結(jié)構(gòu)淺析
你知道Linux內(nèi)核調(diào)試關(guān)鍵技術(shù)之一的printk?
Linux中的Printk與dmesg功能
嵌入式LINUX系統(tǒng)內(nèi)核和內(nèi)核模塊調(diào)試
內(nèi)核調(diào)試利器printk的使用心得
介紹一下linux內(nèi)核比較優(yōu)秀的調(diào)試方式KGDB
Linux內(nèi)核中如何修改printk等級(jí)
內(nèi)核調(diào)試工具printkprintk的輸出格式
Linux內(nèi)核printk日志級(jí)別全解析:從參數(shù)解讀到實(shí)操配置
Linux內(nèi)核日志玩明白了嗎?printk調(diào)試神器全解析
評(píng)論