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表示全都打开。

Linux kernel debug技巧----开启DEBUG选项_第1张图片

方法二:其实开启DEBUG宏的方法很简单,在需要pr_debug/dev_dbg输出的模块开头,直接#define DEBUG即可,切记一定要在开头,如下图所示,如果你放在某个include 头文件之后,有可能这个头文件包含是pr_debug定义的头文件printk.h,导致打印没打开。开启之后,在dmesg中就可以看到pr_debug/dev_dbg的打印了。

Linux kernel debug技巧----开启DEBUG选项_第2张图片

2)kernel printk的默认日志级别大于7

先看看默认的console打印级别:

将上图中7改为大于7的数即可,比如8:

不够打印级别的信息会被写到日志中可通过dmesg 命令来查看

你可能感兴趣的:(Linux驱动)