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 命令來查看