国产精品久久久久永久免费看,大地资源网更新免费播放视频,国产成人久久av免费,成人欧美一区二区三区黑人免费,丁香五月天综合缴情网

  • 正文
  • 相關推薦
申請入駐 產業(yè)圖譜

使用動態(tài)輸出打印內核的DEBUG信息

2023/01/06
407
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

簡介

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

要開啟動態(tà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)輸出技術的文件名路徑,輸出語句所在的行號、模塊名和將要輸出的語句等。

你可以通過以下命令查看目前所有調試狀態(tài)的行為配置:

cat?/sys/kernel/debug/dynamic_debug/control

你也可以應用標準的Unix文本過濾命令來過濾這些數據, 例如:

grep?-i?rdma?/sys/kernel/debug/dynamic_debug/control??|?wc?-l

在第三列顯示了調試狀態(tài)位的激活標志。如果無額外行為被激話, 為 "=_"。因此你可以通過下面的命令查看任何不是默認標志的狀態(tài)位:

awk?'$3?!=?"=_"'?<debugfs>/dynamic_debug/control

命令行使用方法

在語法層面上,一個命令由一系列的規(guī)格匹配組成,最后由一個標記來改變這規(guī)格。

command?::=?match-spec*?flags-spec

match-spec常用來選擇一個已知的dprintk()調用點的子集來套用flags-spec。把他們當做彼此之間的每對做隱式查詢。注意,一個空的match_specs列表是有可能的,但不是非常有用,因為它不會匹配任何調用點的調試子句。

一個匹配規(guī)范由一個關鍵字組成,關鍵字控制被比較的調用點的屬性和要比較的值??赡荜P鍵字是:

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”就是無效的

每個關鍵字的含義如下:

func:給定的字符串會和每個調用點的函數名比較。例如:?func svc_tcp_accept

file:給定的字符串會和每個調用點的源文件的全路徑名或者相對名比較。例如:?file svcsock.c, ?file /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svcsock.c

module:給定的字符串會和每個調用點的模塊名進行比較。模塊名是和在ls mod 里看到的字符串一樣。例如,module sunrpc

format:給定的字符串會在動態(tài)調試格式字符串里查找。注意這字符串不需要匹配這個格式??崭窈推渌厥庾址軌蛴冒诉M制字符語法來轉義,例如空字符是40。作為選擇,這個字符串可以附上雙引號(")或者是單引號(‘)。例如:

??format?svcrdma:?????//?NFS/RDMA?服務器的dprintks
??format?readahead?????//?一些在預加載緩存里的dprintks
??format?nfsd:40SETATTR?//?一個使用空格來匹配格式的方式
??format?"nfsd:?SETATTR"?//?一個整齊的方法來用空格匹配格式
??format?'nfsd:?SETATTR'?//?同樣是一個用空格來匹配格式的方法和
    line:給定的行號或者是行號范圍會和每個dprintk()調用點的行號進行比較。例如:
??line?1603?????//?準確定位到1603行?
??line?1600-1605?//1600行到1605行之間的6行
??line?-1605?????//?從第一行到1605行之間的1605行
??line?1600-?????//?從1600行到結尾的全部行

標記規(guī)范包含了一個由一個或多個標記字符跟隨的變化操作。這變化操作如下所示:

-?//移除給定的標記

+?//加入給定的標記

=?//設置標記到給定的標記上?

f?//包含已打印消息的函數名

l?//包含已在打印消息的行號

m?//包含已打印消息的模塊名

p?//產生一個printk()消息到顯示系統(tǒng)啟動日志

t?//包含了不在中斷上下文中產生的消息里的線程ID

傳遞啟動參數給內核

在調試系統(tǒng)啟動是時,像USB核心初始化等,這些代碼在系統(tǒng)進入shell前已經初始化完畢,因此無法及時打開動態(tài)輸出語句。這時可以在內核啟動時傳遞參數給內核,在系統(tǒng)初始化時就打開它們。

例如,在內核命令行中添加 usbnet.dyndbg=+plft ,就可以在啟動時打開 usbnet的動態(tài)輸出。

在內核啟動后,通過 dmesg | grep "usbnet" 即可看到輸出的調試信息。

舉例

打開文件svcsock.c 1603行動態(tài)輸出語句

echo?-n?'file?svcsock.c?line?1603?+p'?>?/sys/kernel/debug/dynamic_debug/control

打開文件svcsock.c所有動態(tài)輸出語句

echo?-n?'file?svcsock.c?+p'?>?/sys/kernel/debug/dynamic_debug/control

打開NFS服務模塊所有動態(tài)輸出語句

echo?-n?'module?nfsd?+p'?>?/sys/kernel/debug/dynamic_debug/control

打開函數svc_process()的所有動態(tài)輸出語句

echo?-n?'func?svc_process?+p'?>?/sys/kernel/debug/dynamic_debug/control

關閉函數svc_process()的所有動態(tài)輸出語句

echo?-n?'func?svc_process?-p'?>?/sys/kernel/debug/dynamic_debug/control

打開NFS調用的所有以READ開始的信息.

echo?-n?'format?"nfsd:?READ"?+p'?>?/sys/kernel/debug/dynamic_debug/control

查看輸出的信息可以使用 dmesg | grep XXX 。也可以使用 tail -f /var/log/dmesg來實時監(jiān)控dmesg的日志輸出。

本文參考

dynamic-debug-howto.txt

《奔跑吧Linux內核》

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

作者就職于某500強公司,擔任BSP工程師。具有豐富的嵌入式開發(fā)經驗。專欄主要分享計算機基礎,操作系統(tǒng),Linux驅動開發(fā),Arm體系與架構,C/C++,數據結構與算法等相關文章。歡迎關注我的公眾號【嵌入式與Linux那些事】,一起學習交流。