linux 内核dmesg,linux內核調試kmsg,dmesg
dmesg為我們多用,man dmesg告知dmesg用來(lái)顯示和管理kernel ring buffer,那麼後者為何物,以及dmesg顯示何類信息,是本文待闡述的內(nèi)容。
documentation/trace/ring-buffer-design.txt包含了詳細(xì)的設(shè)計(jì)方案(看來(lái)documentation下的內(nèi)容應(yīng)是後續(xù)查找tutor的首選), 其中細(xì)節(jié)不是目前所需,但看起來(lái)卻是是設(shè)計(jì)無(wú)鎖(lockless)日誌系統(tǒng)的絕佳參考資料。
ring buffer(rb)和kernel ring buffer(krb)是不同的東西,前者泛指一類buffer設(shè)計(jì)方案,後者特指Linux內(nèi)核使用的ring buffer。
rb有兩種模式:
1、producer/consumer模式:如果生產(chǎn)的太多,沒(méi)有來(lái)得及消費(fèi),「?jìng)}庫(kù)」佔(zhàn)滿了,那麼就暫停生產(chǎn)--這種模式可能會(huì)丟失最近的事件記錄。
2、overwrite模式:生產(chǎn)者填滿「?jìng)}庫(kù)」的時(shí)候,它仍然繼續(xù)生產(chǎn),並覆蓋最舊的事件記錄--這種模式可能會(huì)丟失最舊的事件記錄。
kernel日誌(如printk的數(shù)據(jù))視情況發(fā)往不同的地方:
- 如果klogd和syslogd都在運(yùn)行,kernel messages被寫到/var/log/messages的末尾(或者syslogd配置給定的地方),此時(shí)和級(jí)別無(wú)關(guān),所有級(jí)別日誌信息都寫入。
- 如果klogd沒(méi)有運(yùn)行,消息不會(huì)發(fā)往用戶空間(不會(huì)寫messages文件?),除非顯式讀取/proc/kmsg(一般通過(guò)kmsg)。
讀取krb的首選方案是dmesg,dmesg其實(shí)是通過(guò)系統(tǒng)調(diào)用syslog去讀取的。
1./proc/kmsg
在程序開(kāi)發(fā)過(guò)程中,LOG是廣泛使用的用來(lái)記錄程序執(zhí)行過(guò)程的機(jī)制,它既可以用於程序調(diào)試,也可以用於產(chǎn)品運(yùn)營(yíng)中的事件記錄。在Android系統(tǒng)中,提供了簡(jiǎn)單、便利的LOG機(jī)制,開(kāi)發(fā)人員可以方便地使用。在這一篇文章中,我們簡(jiǎn)單介紹在Android驅(qū)動(dòng)LOG的使用和查看方法。
Android內(nèi)核是基於Linux?Kerne?2.36的,因此,Linux?Kernel的LOG機(jī)制同樣適合於Android內(nèi)核,它就是有名的printk,與C語(yǔ)言的printf齊名。與printf類似,printk提供格式化輸入功能,同時(shí),它也具有所有LOG機(jī)制的特點(diǎn)--提供日誌級(jí)別過(guò)慮功能。
printk()有一個(gè)控制日誌級(jí)別的字段,如果該字段的日記級(jí)別高於console默認(rèn)的日誌級(jí)別那麼才會(huì)打印出來(lái)(數(shù)值越小日誌級(jí)別越高,分為從 0-7共計(jì)8個(gè)日誌級(jí)別)。
printk提供了8種日誌級(jí)別():
#define?KERN_EMERG??"<0>"
#define?KERN_ALERT??"<1>"
#define?KERN_CRIT???"<2>"
#deinfe?KERN_ERR????"<3>"
#deinfe?KERN_WARNING????"<4>"
#deinfe?KERN_NOTICE?"<5>"
#deinfe?KERN_INFO???"<6>"
#deinfe?KERN_DEBUG??"<7>"
printk的使用方法:
printk(KERN_ALERT"This?is?the?log?printed?by?printk?in?linux?kernel?space.");
KERN_ALERT表示日誌級(jí)別,後面緊跟著要格式化字符串。
有一種簡(jiǎn)單的改變當(dāng)前終端的日誌級(jí)別的方法:#echo 8 > /proc/sys/kernel/printk。理論上這樣printk就能輸出到終端了。
在Android系統(tǒng)中,printk輸出的日誌信息保存在/proc/kmsg中,使用查看命令:
adb?shell?cat?/proc/kmsg??|?grep?"alarm"?//grep?"alarm"表示只抓取alarm的信息
或者:
USER-NAME@MACHINE-NAME:~/Android$?adb?shell
root@android :/?#?cat??/proc/kmsg?|?grep?"alarm"?//grep?"alarm"表示只抓取alarm的信息
直接查看/proc/kmsg時(shí)讀取了緩衝區(qū)中的數(shù)據(jù)後,將緩衝區(qū)中的數(shù)據(jù)刪除
2.dmesg
今天想要調(diào)試android系統(tǒng),串口debug沒(méi)接出來(lái),最後想嘗試一直打印dmesg的方法,修改循環(huán)緩衝區(qū)的大小,打完dmesg後自動(dòng)清空。
小記錄下,希望能幫到需要的人:
dmesg 在不刷新緩衝區(qū)的情況下獲得緩衝區(qū)的內(nèi)容,並將內(nèi)容返回給stdout。
dmesg -c 打印dmesg後清空循環(huán)緩衝區(qū)
dmesg -s 64 設(shè)置dmesg循環(huán)緩衝區(qū)大小為64
總結(jié)
以上是生活随笔為你收集整理的linux 内核dmesg,linux內核調試kmsg,dmesg的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux一键启动脚本,Linux一键启
- 下一篇: linux cat 进程,Linux下C