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 命令来查看
更多推荐
所有评论(0)