dev_dbg将日志写入哪里?

时间:2017-05-13 07:52:46

标签: linux-device-driver

在Linux树的设备驱动程序源中,我看到dev_dbg(...)dev_err(...),在哪里可以找到记录的消息?

一个参考建议添加#define DEBUG。另一个reference涉及动态调试和debugfs,我迷路了。

2 个答案:

答案 0 :(得分:3)

dev_dbg()根据编译标记扩展为dynamic_dev_dbg()dev_printk()或无操作。

#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

dynamic_dev_dbg()dev_printk()致电dev_printk_emit(),致电vprintk_emit()

当您执行printk()时,在正常模式下调用此功能。请注意,dev_err()之类的其他函数将以相同的函数结束。

因此,显然,缓冲区是完全相同的,即内核肾内缓冲区。

结尾处记录的消息将打印到

  1. 当前控制台,如果内核 loglevel 值(可以通过内核命令行或通过procfs更改)对某些消息足够高,这里是KERN_DEBUG。
  2. 内部缓冲区,可以通过运行dmesg命令来读取。
  3. 注意,只要缓冲区中仍有空间,就会保留2中的数据。由于它是有限的和循环的,新的数据优先于旧的。

答案 1 :(得分:1)

您可以在内核消息中找到dev_err(...)。顾名思义,dev_err(...)消息是错误消息,因此,如果执行到这一点,则肯定会打印它们。 dev_dbg(...)是调试消息,在内核驱动程序代码中使用较多,缺省情况下不会打印它们。因此,您所了解的关于dynamic_debugging的所有内容都将与dev_dbg(...)一起发挥作用。

要进行动态调试,有几个先决条件,下面的1.和2.是动态调试的一般先决条件。 3.及更高版本适用于您特定的驱动程序/模块/子系统,可以是。

  1. 动态调试支持必须位于内核配置CONFIG_DYNAMIC_DEBUG=y中。您可以检查是否为zgrep DYNAMIC_DEBUG /proc/config.gz
  2. 必须安装
  3. debugfs。您可以使用sudo mount | grep debugfs进行检查,如果不存在,则可以使用sudo mount -t debugfs /sys/kernel/debug
  4. 进行安装
  5. 参考dynamic_debugging并启用您感兴趣的特定文件/功能/行