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