dev_dbg 将日志写入何处?

gol*_*pot 6 linux-device-driver

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

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

0an*_*riy 6

dev_dbg()根据编译标志扩展为dynamic_dev_dbg()dev_printk()或 no-op 。

#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
Run Code Online (Sandbox Code Playgroud)

dynamic_dev_dbg()dev_printk()调用dev_printk_emit()which 调用vprintk_emit()

当您只执行printk(). 在这里请注意,其余的函数dev_err()会在同一个函数中结束。

因此,显然,缓冲区都是相同的,即内核内部缓冲区。

最后记录的消息打印到

  1. 当前控制台,如果内核日志级别值(可以通过内核命令行或通过 procfs 更改)对于某些消息来说足够高,这里是 KERN_DEBUG。
  2. 可以通过运行dmesg命令读取的内部缓冲区。

请注意,只要缓冲区中还有空间,就会保留 2 中的数据。由于它是有限的和循环的,新的数据会抢占旧的数据。

附加信息如何启用动态调试。

首先,确定你CONFIG_DYNAMIC_DEBUG=y在内核中有配置。

假设我们希望名为8250内置模块中启用所有调试打印。为了实现这一点,我们简单地将以下内容添加到内核命令行中8250.dyndbg=+p

如果相同的驱动程序被编译为可加载模块,我们可以手动添加options 8250 dyndbgmodprobe配置或 shell 命令行,例如modprobe 8250 dyndbg.

动态调试文档中描述了更多详细信息。