打开dev_dbg()调试开关


打开dev_dbg开关,使其日志输出到控制台


内核驱动中(大多数是子系统中)有大量使用dev_dbg打印日志信息,但是这些信息默认是不会输出到控制台的。调试过程中,我们如何打开DEBUG,获取这些dev_dbg日志呢?

打开dev_dbg需要满足两个条件:

  • 开启DEBUG
  • 调整printk日志级别

下面介绍为什么需要这两个条件以及如何修改。

开启DEBUG

首先看下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调试开关的第一个条件。

调整printk日志级别

打开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
  • Rockchip平台修改方式

修改DEFAULT_CONSOLE_LOGLEVEL

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平台修改方式

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的大量日志等等。

参考蜗窝Linux kernel debug技巧

猜你喜欢

转载自blog.csdn.net/u014770862/article/details/81408859