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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值