内核中的大部分驱动都使用了dev_dbg接口打印调试信息,默认是不会输出到控制台的。
先看一下dev_dbg的定义:
文件路径:/kernel/include/linux/device.h
#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
动态调试dev_dbg要打开CONFIG_DYNAMIC_DEBUG这个配置项,具体没有操作过,其中的原理也没有跟踪分析。这里指介绍第二种开启dev_dbg的方式。
在需要打印dev_dbg调试信息的驱动文件开头定义DEBUG宏。注意必须是在
#define DEBUG
#include
打开DEBUG宏是第一步,这个时候还是不能输出到控制台的,还必须要修改printk打印等级。
printk打印等级:
#define KERN_EMERG KERN_SOH "0" /* system is unusable */
#define KERN_ALERT KERN_SOH "1" /* action must be taken immediately */
#define KERN_CRIT KERN_SOH "2" /* critical conditions */
#define KERN_ERR KERN_SOH "3" /* error conditions */
#define KERN_WARNING KERN_SOH "4" /* warning conditions */
#define KERN_NOTICE KERN_SOH "5" /* normal but significant condition */
#define KERN_INFO KERN_SOH "6" /* informational */
#define KERN_DEBUG KERN_SOH "7" /* debug-level messages */
printk.c中定义的默认打印等级如下:
#define CONSOLE_LOGLEVEL_SILENT 0 /* Mum's the word */
#define CONSOLE_LOGLEVEL_MIN 1 /* Minimum loglevel we let people use */
#define CONSOLE_LOGLEVEL_QUIET 4 /* Shhh ..., when booted with "quiet" */
#define CONSOLE_LOGLEVEL_DEFAULT 7 /* anything MORE serious than KERN_DEBUG */
printk默认的打印等级是7,而dev_dbg的打印等级也是7,只有等级高于printk默认打印等级的日志信息才能输出出来。
所以这里直接修改DEFAULT_CONSOLE_LOGLEVEL为8,这样dev_dbg就可以输出了,当然还有其他的修改方式。
在cmdline中传入loglevel=8也能输出dev_dbg日志。