使用動態(tài)輸出打印內(nèi)核的DEBUG信息
簡介
printk()是很多嵌入式開發(fā)者喜歡用的調(diào)試手段之一,但是,使用printk()每次都要重新編譯內(nèi)核,很不方便。使用動態(tài)輸出在不需要重新編譯內(nèi)核的情況下,方便的打印出內(nèi)核的debug信息。
要開啟動態(tài)輸出,內(nèi)核需要添加CONFIG_DYNAMIC_DEBUG?。開啟宏之后,pr_debug(),?dev_dbg() ,?print_hex_dump_debug(),print_hex_dump_bytes()`所有信息都可以被動態(tài)打印出來。
動態(tài)輸出支持的特性
動態(tài)輸出在debugfs文件系統(tǒng)中對應的是control文件節(jié)點。control文件節(jié)點記錄了系統(tǒng)中所有使用動態(tài)輸出技術(shù)的文件名路徑,輸出語句所在的行號、模塊名和將要輸出的語句等。
你可以通過以下命令查看目前所有調(diào)試狀態(tài)的行為配置:
你也可以應用標準的Unix文本過濾命令來過濾這些數(shù)據(jù), 例如:
在第三列顯示了調(diào)試狀態(tài)位的激活標志。如果無額外行為被激話, 為 "=_"。因此你可以通過下面的命令查看任何不是默認標志的狀態(tài)位:
命令行使用方法
在語法層面上,一個命令由一系列的規(guī)格匹配組成,最后由一個標記來改變這規(guī)格。
match-spec常用來選擇一個已知的dprintk()調(diào)用點的子集來套用flags-spec。把他們當做彼此之間的每對做隱式查詢。注意,一個空的match_specs列表是有可能的,但不是非常有用,因為它不會匹配任何調(diào)用點的調(diào)試子句。
一個匹配規(guī)范由一個關(guān)鍵字組成,關(guān)鍵字控制被比較的調(diào)用點的屬性和要比較的值??赡荜P(guān)鍵字是:
注意:line-range不能包含空格,例如,“1-30”是有效的范圍,但“1 - 30”就是無效的
每個關(guān)鍵字的含義如下:
- func:給定的字符串會和每個調(diào)用點的函數(shù)名比較。例如:func svc_tcp_accept
- file:給定的字符串會和每個調(diào)用點的源文件的全路徑名或者相對名比較。例如:file svcsock.c?,file /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svcsock.c
- module:給定的字符串會和每個調(diào)用點的模塊名進行比較。模塊名是和在ls mod? 里看到的字符串一樣。例如,module sunrpc
- format:給定的字符串會在動態(tài)調(diào)試格式字符串里查找。注意這字符串不需要匹配這個格式??崭窈推渌厥庾址軌蛴冒诉M制字符語法來轉(zhuǎn)義,例如空字符是\040。作為選擇,這個字符串可以附上雙引號(")或者是單引號(‘)。例如:
- line:給定的行號或者是行號范圍會和每個dprintk()調(diào)用點的行號進行比較。例如:
標記規(guī)范包含了一個由一個或多個標記字符跟隨的變化操作。這變化操作如下所示:
傳遞啟動參數(shù)給內(nèi)核
在調(diào)試系統(tǒng)啟動是時,像USB核心初始化等,這些代碼在系統(tǒng)進入shell前已經(jīng)初始化完畢,因此無法及時打開動態(tài)輸出語句。這時可以在內(nèi)核啟動時傳遞參數(shù)給內(nèi)核,在系統(tǒng)初始化時就打開它們。
例如,在內(nèi)核命令行中添加 usbnet.dyndbg=+plft ,就可以在啟動時打開 usbnet的動態(tài)輸出。
在內(nèi)核啟動后,通過 dmesg | grep "usbnet" 即可看到輸出的調(diào)試信息。
舉例
打開文件svcsock.c 1603行動態(tài)輸出語句
打開文件svcsock.c所有動態(tài)輸出語句
打開NFS服務模塊所有動態(tài)輸出語句
打開函數(shù)svc_process()的所有動態(tài)輸出語句
關(guān)閉函數(shù)svc_process()的所有動態(tài)輸出語句
打開NFS調(diào)用的所有以READ開始的信息.
查看輸出的信息可以使用 dmesg | grep XXX? 。也可以使用 tail -f /var/log/dmesg來實時監(jiān)控dmesg的日志輸出。
本文參考
dynamic-debug-howto.txt
《奔跑吧Linux內(nèi)核》