如何開啟pr debug除錯資訊

2021-08-03 13:00:46 字數 3291 閱讀 1016

from:

如何開啟pr_debug除錯資訊,先不要著急,我們先靜下心來分析一下這個函式的源**。。。

以dma的除錯為例,先來看看乙個pr_debug函式呼叫

[plain]view plain

copy

pr_debug("%s: %s (%s)\n",  

__func__,  

chan ? "success" : "fail",  

chan ? dma_chan_name(chan) : null);  

在include/linux/printk.h裡找到pr_debug的定義,這裡暗藏了玄機。

[plain]view plain

copy

/* if you are writing a driver, please use dev_dbg instead */  

#if defined(config_dynamic_debug)  

/* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */  

#define pr_debug(fmt, ...) \  

dynamic_pr_debug(fmt, ##__va_args__)  

#elif defined(debug)  

#define pr_debug(fmt, ...) \  

printk(kern_debug pr_fmt(fmt), ##__va_args__)  

#else  

#define pr_debug(fmt, ...) \  

no_printk(kern_debug pr_fmt(fmt), ##__va_args__)  

#endif  

原來,三個巨集作為判斷條件決定了pr_debug到底採用哪種用法:

第一種用法,如果定義了config_dynamic_debug,就使用動態debug機制dynamic_pr_debug();

第二種用法,如果定義了debug,就使用printk(kern_debug...)

第三種用法,預設情況下,不列印。

第三種不列印肯定不是我們想要的,那麼要想讓kernel乖乖的列印除錯資訊,就只有前面兩條路可選了:要麼動態debug,要麼定義debug巨集。

先說一下如何定義debug巨集:

其實在kernel中很多driver已經定義好了這樣的debug選項,前人栽樹,後人乘涼,我們可以先看看有沒有現成的

例如,我們經常可以看到這樣的配置選項和巨集定義:

(1)dma engine debugging(config_dmadevices_debug )

(2)power management debug support(config_pm_debug)

(3) enable debug for the b2c2 flexcop drivers(config_pci_debug)

以dma為例,在drivers/dma/makefile中定義了編譯選項

ccflags-$(config_dmadevices_debug)  := -ddebug

其作用相當於在drivers/dma/所有子檔案定義了巨集#define debug

小夥伴們趕緊把config_debug選項選上吧,然後重新編譯kernel。先別急,這樣還不夠,

預設的console級別是7(在kernel/printk/printk.c中定義了#define default_console_loglevel 7)

只有那些級別「小於7」的除錯資訊才能列印出來,而printk(kern_debug...)的級別是7,那就還需要提高console列印級別

如果要檢視dma初始化的debug資訊,那就直接改**

#define default_console_loglevel 8

如果是runtime,可以直接通過printk的sys介面調整列印級別

$cat /proc/sys/kernel/printk

7       4       1       7

$echo 8 > /proc/sys/kernel/printk

$cat /proc/sys/kernel/printk

8       4       1       7

ok,大功告成!

如果一些driver沒有現成的巨集可用,那麼你可以在你想debug的原始檔中直接定義debug巨集,例如你想檢視driver/video/fsl-diu-fb.c的除錯資訊,直接在標頭檔案引用後新增巨集定義

#define debug(巨集的作用範圍相信我就不用多說了吧,就是從巨集定義開始到原始檔的末尾結束),就能如願以償了。

開發人員也可以自己仿照上述方法進行定義。

下面再簡單說一下kernel的動態除錯

開啟enable dynamic printk() support(dynamic_debug),那麼所有的 pr_debug()/dev_debug() 之類的函式在runtime就可以動態地使用了。

kernel動態除錯提供乙個debugfs介面: /dynamic_debug/control 

這個檔案可以用來獲取已完成的除錯資訊列表

例如你要顯示檔案'svcsock.c'的1603行內容,你可以這樣做:

nullarbor:~ # echo 'file svcsock.c line 1603 +p' >

/dynamic_debug/control  

// 提供檔案svcsock.c所有資訊 

nullarbor:~ # echo -n 'file svcsock.c +p' >

/dynamic_debug/control 

如果你想執行多個命令,你需要為每個加入「echo」分割,像這樣:

nullarbor:~ # echo 'file svcsock.c line 1603 +p' > /proc/dprintk ;\

> echo 'file svcsock.c line 1563 +p' > /proc/dprintk

或者甚至是這樣: 

nullarbor:~ # (

> echo 'file svcsock.c line 1603 +p' ;\

> echo 'file svcsock.c line 1563 +p' ;\

> ) > /proc/dprintk 

file可以替換成module,format等匹配方式,具體用法請參考documentation/dynamic-debug-howto.txt

好了,enjoy你的debug之旅吧!

如何開啟pr debug除錯資訊

2014年09月05日 綜合 共 2396字 字型大小 小 中 大 如何開啟pr debug除錯資訊 以dma的除錯為例,先來看看乙個pr debug函式呼叫 pr debug s s s n func chan success fail chan dma chan name chan null 在...

如何開啟pr debug除錯資訊

以dma的除錯為例,先來看看乙個pr debug函式呼叫 pr debug s s s n func chan success fail chan dma chan name chan null 在include linux printk.h裡找到pr debug的定義 if you are wri...

動態除錯pr debug

最近在看overlay fs 時發現裡面有些函式裡使用pr debug加了一些列印資訊。那麼如何開啟這個列印資訊呢?首先檢視pr debug的定義 if defined config dynamic debug dynamic pr debug uses pr fmt internally so w...