打开dev_dbg开关,使其日志输出到控制台
内核驱动中(大多数是子系统中)有大量使用dev_dbg打印日志信息,但是这些信息默认是不会输出到控制台的。调试过程中,我们如何打开DEBUG,获取这些dev_dbg日志呢?
打开dev_dbg需要满足两个条件:
下面介绍为什么需要这两个条件以及如何修改。
首先看下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); \
0; \
})
#endif
动态调试dev_dbg过程繁琐,且需要内核打开CONFIG_DYNAMIC_DEBUG选项才可以,这里暂不讨论。
首先需要定义DEBUG,即
#define dev_dbg(dev, format, arg...) \
dev_printk(KERN_DEBUG, dev, format, ##arg)
在需要打开dev_dbg的驱动文件模块开头:
#define DEBUG /* Enable dev_dbg */
#include xxx
...
<xxx.c>
根据dev_dbg的定义,只有打开DEBUG,才能满足打开dev_dbg调试开关的第一个条件。
打开DEBUG开关后,dev_dbg日志也是不会输出到控制台的。因为默认的printk日志级别是7,只有高于该级别的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 */
而dev_dbg的日志级别也是7,如下:
#define dev_dbg(dev, format, arg...) \
dev_printk(KERN_DEBUG, dev, format, ##arg)
因此,默认不会输出到控制台。
需要修改printk默认日志级别低于dev_dbg的日志级别,dev_dbg日志信息才能输出到控制台。修改printk默认日志级别的方法有很多种,这里提供两种:
DEFAULT_CONSOLE_LOGLEVEL表示控制台输出的最低级别,默认的DEFAULT_CONSOLE_LOGLEVEL在内核文件kernel/printk.c中定义:
/* We show everything that is MORE important than this.. */
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
修改这里的DEFAULT_CONSOLE_LOGLEVEL为8,这样KERN_DEBUG就可以输出到控制台了。
Rockchip也可以通过第一种方式实现,但是这种方式略显粗暴,这里我们提供另外一种方式,即通过命令行参数传递的方式传递loglevel来修改printk默认日志级别。
RK命令行参数传递是通过parameter实现的,有关parameter详细信息可自行查阅资料。这里给出修改方式,parameter修改如下:
...
CMDLINE:console=ttyFIQ0 loglevel=8 androidboot.selinux=permissive
androidboot.hardware=rk30board androidboot.console=ttyFIQ0 ...
...
添加loglevel=8设置kernel printk的默认日志级别为8,这样KERN_DEBUG就可以输出到控制台了。
注:CMDLINE命令行参数传递是如何修改printk默认日志级别有待研究。
需要满足两个条件才能打开dev_dbg调试开关,开启DEBUG的方法也有缺陷,就是必须在驱动文件定义#define DEBUG,如果需要调试的文件很多,或者调试初期无法确定问题是在哪个文件时,如何处理?这里提供一个参考,kernel顶层Makefile中KBUILD_CFLAGS+=DDEBUG可实现,但又会引入更多问题,比如DVFS的大量日志等等。