Linux kernel debug技巧----開啓DEBUG選項

kernel的source code中有很多使用pr_debug/dev_dbg輸出的日誌信息(例如device tree解析的代碼,drivers/of/fdt.c)。默認情況下,kernel不會將這些日誌輸出到控制檯上,比如dev_dbg定義如下:

#if defined(CONFIG_DYNAMIC_DEBUG)
#define dev_dbg(dev, format, ...)		     \
do {						     \
	dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \
} while (0)
#elif defined(DEBUG)
#define dev_dbg(dev, format, arg...)		\
	dev_printk(KERN_DEBUG, dev, format, ##arg)
#else
#define dev_dbg(dev, format, arg...)				\
({								\
	if (0)							\
		dev_printk(KERN_DEBUG, dev, format, ##arg);	\
})
#endif

第一種用法,如果定義了CONFIG_DYNAMIC_DEBUG,就使用動態debug機制dynamic_pr_debug();
第二種用法,如果定義了DEBUG,就使用printk(KERN_DEBUG...)
第三種用法,默認情況下,不打印(所以默認的時候在dmesg中看不到該打印)。

第三種用法肯定不是我們想要,第一種有點複雜,今天我們就來介紹第二種用法

1)開啓了DEBUG宏

方法一:最簡單的打開DEBUG宏的方法是修改Makefile文件,比如我們要打開kernel/drivers/mmc/下面所有文件以及子目錄下所有文件的DEBUG宏,可以在kernel/drivers/mmc/Makefile中添加如下代碼,其中,如果是ccflags-y := -DDEBUG表示只打開kernel/drivers/mmc/下面的文件的DEBUG宏,但不包括子目錄下的文件的DEBUG宏,而subdir-ccflags-y := -DDEBUG表示全都打開。

方法二:其實開啓DEBUG宏的方法很簡單,在需要pr_debug/dev_dbg輸出的模塊開頭,直接#define DEBUG即可,切記一定要在開頭,如下圖所示,如果你放在某個include 頭文件之後,有可能這個頭文件包含是pr_debug定義的頭文件printk.h,導致打印沒打開。開啓之後,在dmesg中就可以看到pr_debug/dev_dbg的打印了。

2)kernel printk的默認日誌級別大於7

先看看默認的console打印級別:

將上圖中7改爲大於7的數即可,比如8:

不夠打印級別的信息會被寫到日誌中可通過dmesg 命令來查看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章