如何開啟pr debug除錯資訊

2021-07-02 20:08:26 字數 3003 閱讀 7316

2023年09月05日

⁄ 綜合⁄ 共 2396字 ⁄ 字型大小

小 中 大

如何開啟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 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

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

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

以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除錯資訊

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...