新聞中心
簡(jiǎn)介
printk()是很多嵌入式開發(fā)者喜歡用的調(diào)試手段之一,但是,使用printk()每次都要重新編譯內(nèi)核,很不方便。使用動(dòng)態(tài)輸出在不需要重新編譯內(nèi)核的情況下,方便的打印出內(nèi)核的debug信息。

成都創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè),為客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)開發(fā)服務(wù),多年建網(wǎng)站服務(wù)經(jīng)驗(yàn),各類網(wǎng)站都可以開發(fā),成都品牌網(wǎng)站建設(shè),公司官網(wǎng),公司展示網(wǎng)站,網(wǎng)站設(shè)計(jì),建網(wǎng)站費(fèi)用,建網(wǎng)站多少錢,價(jià)格優(yōu)惠,收費(fèi)合理。
要開啟動(dòng)態(tài)輸出,內(nèi)核需要添加CONFIG_DYNAMIC_DEBUG?。開啟宏之后,pr_debug(),?dev_dbg() ,?print_hex_dump_debug(),print_hex_dump_bytes()`所有信息都可以被動(dòng)態(tài)打印出來(lái)。
動(dòng)態(tài)輸出支持的特性
動(dòng)態(tài)輸出在debugfs文件系統(tǒng)中對(duì)應(yīng)的是control文件節(jié)點(diǎn)。control文件節(jié)點(diǎn)記錄了系統(tǒng)中所有使用動(dòng)態(tài)輸出技術(shù)的文件名路徑,輸出語(yǔ)句所在的行號(hào)、模塊名和將要輸出的語(yǔ)句等。
你可以通過以下命令查看目前所有調(diào)試狀態(tài)的行為配置:
cat /sys/kernel/debug/dynamic_debug/control
你也可以應(yīng)用標(biāo)準(zhǔn)的Unix文本過濾命令來(lái)過濾這些數(shù)據(jù), 例如:
grep -i rdma /sys/kernel/debug/dynamic_debug/control | wc -l
在第三列顯示了調(diào)試狀態(tài)位的激活標(biāo)志。如果無(wú)額外行為被激話, 為 "=_"。因此你可以通過下面的命令查看任何不是默認(rèn)標(biāo)志的狀態(tài)位:
awk '$3 != "=_"'/dynamic_debug/control
命令行使用方法
在語(yǔ)法層面上,一個(gè)命令由一系列的規(guī)格匹配組成,最后由一個(gè)標(biāo)記來(lái)改變這規(guī)格。
command ::= match-spec* flags-spec
match-spec常用來(lái)選擇一個(gè)已知的dprintk()調(diào)用點(diǎn)的子集來(lái)套用flags-spec。把他們當(dāng)做彼此之間的每對(duì)做隱式查詢。注意,一個(gè)空的match_specs列表是有可能的,但不是非常有用,因?yàn)樗粫?huì)匹配任何調(diào)用點(diǎn)的調(diào)試子句。
一個(gè)匹配規(guī)范由一個(gè)關(guān)鍵字組成,關(guān)鍵字控制被比較的調(diào)用點(diǎn)的屬性和要比較的值??赡荜P(guān)鍵字是:
match-spec ::= 'func' string |
'file' string |
'module' string |
'format' string |
'line' line-range
line-range ::= lineno |
'-'lineno |
lineno'-' |
lineno'-'lineno
注意:line-range不能包含空格,例如,“1-30”是有效的范圍,但“1 - 30”就是無(wú)效的
每個(gè)關(guān)鍵字的含義如下:
- func:給定的字符串會(huì)和每個(gè)調(diào)用點(diǎn)的函數(shù)名比較。例如:func svc_tcp_accept
- file:給定的字符串會(huì)和每個(gè)調(diào)用點(diǎn)的源文件的全路徑名或者相對(duì)名比較。例如:file svcsock.c?,file /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svcsock.c
- module:給定的字符串會(huì)和每個(gè)調(diào)用點(diǎn)的模塊名進(jìn)行比較。模塊名是和在ls mod? 里看到的字符串一樣。例如,module sunrpc
- format:給定的字符串會(huì)在動(dòng)態(tài)調(diào)試格式字符串里查找。注意這字符串不需要匹配這個(gè)格式??崭窈推渌厥庾址軌蛴冒诉M(jìn)制字符語(yǔ)法來(lái)轉(zhuǎn)義,例如空字符是\040。作為選擇,這個(gè)字符串可以附上雙引號(hào)(")或者是單引號(hào)(‘)。例如:
format svcrdma: // NFS/RDMA 服務(wù)器的dprintks
format readahead // 一些在預(yù)加載緩存里的dprintks
format nfsd:\040SETATTR // 一個(gè)使用空格來(lái)匹配格式的方式
format "nfsd: SETATTR" // 一個(gè)整齊的方法來(lái)用空格匹配格式
format 'nfsd: SETATTR' // 同樣是一個(gè)用空格來(lái)匹配格式的方法和
- line:給定的行號(hào)或者是行號(hào)范圍會(huì)和每個(gè)dprintk()調(diào)用點(diǎn)的行號(hào)進(jìn)行比較。例如:
line 1603 // 準(zhǔn)確定位到1603行
line 1600-1605 //1600行到1605行之間的6行
line -1605 // 從第一行到1605行之間的1605行
line 1600- // 從1600行到結(jié)尾的全部行
標(biāo)記規(guī)范包含了一個(gè)由一個(gè)或多個(gè)標(biāo)記字符跟隨的變化操作。這變化操作如下所示:
- //移除給定的標(biāo)記
+ //加入給定的標(biāo)記
= //設(shè)置標(biāo)記到給定的標(biāo)記上
f //包含已打印消息的函數(shù)名
l //包含已在打印消息的行號(hào)
m //包含已打印消息的模塊名
p //產(chǎn)生一個(gè)printk()消息到顯示系統(tǒng)啟動(dòng)日志
t //包含了不在中斷上下文中產(chǎn)生的消息里的線程ID
傳遞啟動(dòng)參數(shù)給內(nèi)核
在調(diào)試系統(tǒng)啟動(dòng)是時(shí),像USB核心初始化等,這些代碼在系統(tǒng)進(jìn)入shell前已經(jīng)初始化完畢,因此無(wú)法及時(shí)打開動(dòng)態(tài)輸出語(yǔ)句。這時(shí)可以在內(nèi)核啟動(dòng)時(shí)傳遞參數(shù)給內(nèi)核,在系統(tǒng)初始化時(shí)就打開它們。
例如,在內(nèi)核命令行中添加 usbnet.dyndbg=+plft ,就可以在啟動(dòng)時(shí)打開 usbnet的動(dòng)態(tài)輸出。
在內(nèi)核啟動(dòng)后,通過 dmesg | grep "usbnet" 即可看到輸出的調(diào)試信息。
舉例
打開文件svcsock.c 1603行動(dòng)態(tài)輸出語(yǔ)句
echo -n 'file svcsock.c line 1603 +p' > /sys/kernel/debug/dynamic_debug/control
打開文件svcsock.c所有動(dòng)態(tài)輸出語(yǔ)句
echo -n 'file svcsock.c +p' > /sys/kernel/debug/dynamic_debug/control
打開NFS服務(wù)模塊所有動(dòng)態(tài)輸出語(yǔ)句
echo -n 'module nfsd +p' > /sys/kernel/debug/dynamic_debug/control
打開函數(shù)svc_process()的所有動(dòng)態(tài)輸出語(yǔ)句
echo -n 'func svc_process +p' > /sys/kernel/debug/dynamic_debug/control
關(guān)閉函數(shù)svc_process()的所有動(dòng)態(tài)輸出語(yǔ)句
echo -n 'func svc_process -p' > /sys/kernel/debug/dynamic_debug/control
打開NFS調(diào)用的所有以READ開始的信息.
echo -n 'format "nfsd: READ" +p' > /sys/kernel/debug/dynamic_debug/control
查看輸出的信息可以使用 dmesg | grep XXX? 。也可以使用 tail -f /var/log/dmesg來(lái)實(shí)時(shí)監(jiān)控dmesg的日志輸出。
本文參考
dynamic-debug-howto.txt
《奔跑吧Linux內(nèi)核》
文章標(biāo)題:使用動(dòng)態(tài)輸出打印內(nèi)核的DEBUG信息
網(wǎng)頁(yè)路徑:http://m.fisionsoft.com.cn/article/dhjpdgj.html


咨詢
建站咨詢
