【问题标题】:Prefixing printk / pr_* calls为 printk / pr_* 调用添加前缀
【发布时间】:2015-02-10 04:20:31
【问题描述】:

我想在我的驱动程序(调试)输出前加上它的名称,即[myDriver] Actual message。因为每次我想覆盖printk/pr_* 以实际包含[myDriver] 部分时,写printk(level NAMEMACRO "Actual message\n") 很烦人。但是我想不出办法来做到这一点。在最好的情况下,解决方案不会强迫我更改代码中的printk/pr_* 调用(更改调用后,这变得微不足道)。

这可能吗? (因为我包含了其他标题,而​​这些标题又包含 printk 标题,所以它将始终被定义为排除不链接到原始标题的情况,如其他答案中所建议的那样)

目前的驱动程序有什么理由不看这个文本吗? (还有其他方法可以按驱动过滤 dmesg 吗?)

我对@9​​87654331@ 有所了解,但我没有找到任何针对一般警告的开发人员,因此我将为此使用printk/pr_err

【问题讨论】:

  • Linux-kernel debug printouts? 的可能重复项
  • pr_debug() 的替代品是 dev_dbg()(在 中);但是看不到这些的人不应该编写内核代码。
  • @artlessnoise 尽管pr_debugdev_debug 非常相似,但我认为人们仍然应该区分,要么只是为了null device check,要么是因为实现可能会改变。这也是为什么内核有很多宏只做访问一个结构成员的原因。分离接口和实现。虽然现在直接访问是相同的,但以后可能会改变并得到改进。
  • @CL 很好看,它有我正在寻找的答案。

标签: linux-kernel kernel linux-device-driver kernel-module


【解决方案1】:

使用带有 [drivername] 前缀的 pr_{debug,warn,err}() 的标准。

例如:

 pr_debug("kvm: matched tsc offset for %llu\n", data);

您也可以使用dev_warn()

例如:

 dev_warn(&adap->dev, "Bus may be unreliable\n");

还有其他方法可以按驱动程序过滤 dmesg 吗?

除非您想在加载驱动程序之前运行dmesg -c 以清除日志,否则不会。它总是建议在您的调试/打印消息中为驱动程序名称添加前缀。当您收到来自客户的日志时,您不想浪费时间手动阅读每一行。

【讨论】:

  • 虽然标准格式的输入和推理很有帮助,但我认为没有更简单的方法可以将pr_debug("Message") 转换为pr_debug("MyDriver: Message")?这是问题的主要部分。
  • 也许你可以简单地做一个文本替换。 %s/pr_debug("/pr_debug("MyDriver/gc" 使用你最喜欢的编辑器。
【解决方案2】:

相关答案(在the duplicate 中找到)是#define pr_fmt(来自上面链接的重复问题的代码):

/* At the top of the file, before any includes */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/printk.h>

作为附加说明,如果我包含变量,有时pr_fmt 不会自动为我应用。 printk(pr_fmt("message %p"), (void*)ptr) 中的手动使用修复了这些情况,并遵守定义 pr_fmt 的约定

由于我没有找到重复的问题,我不会为像我这样的其他谷歌用户删除这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2018-12-12
    • 2018-08-19
    • 2018-10-03
    • 2013-01-30
    • 1970-01-01
    相关资源
    最近更新 更多