如何開啟pr debug除錯資訊

2021-07-10 06:00:55 字數 2944 閱讀 9229

以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 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的用法:

1.如果定義了config_dynamic_debug,就使用動態debug機制dynamic_pr_debug();

2.如果定義了debug,就使用printk(kern_debug...)

3.預設情況下,不列印。

那麼要想讓kernel乖乖的列印除錯資訊,就只有兩條路可選了:要麼動態debug,要麼定義debug巨集。

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

其實在kernel中很多driver已經定義好了這樣的選項

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

(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,大功告成!

ps:如果一些driver沒有現成的巨集可用,開發人員可以自己仿照上述方法,也可以直接在原始檔中定義debug巨集

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

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

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

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

=/sys/kernel/debug/

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

例如你要顯示檔案'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除錯資訊

from 如何開啟pr debug除錯資訊,先不要著急,我們先靜下心來分析一下這個函式的源 以dma的除錯為例,先來看看乙個pr debug函式呼叫 plain view plain copy pr debug s s s n func chan success fail chan dma chan...

動態除錯pr debug

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