Linux kernel 在printk/pr_*调用前加前缀

Linux kernel 在printk/pr_*调用前加前缀,linux-kernel,kernel,linux-device-driver,kernel-module,Linux Kernel,Kernel,Linux Device Driver,Kernel Module,我想在我的驱动程序(调试)输出前加上其名称,即[myDriver]实际消息。因为每次我想覆盖printk/pr.*以实际包含[myDriver]部分时,编写printk(级别名称宏“实际消息”\n”)都很烦人。然而,我想不出一个办法来做到这一点。在最好的情况下,解决方案不会强迫我更改代码中的printk/pr.*调用(对于更改的调用,这变得微不足道) 这可能吗?(由于我包括了其他标题,而这些标题又包括printk标题,因此将始终对其进行定义,这排除了在不同so答案中建议的不链接到原始标题的可能性

我想在我的驱动程序(调试)输出前加上其名称,即
[myDriver]实际消息
。因为每次我想覆盖
printk
/
pr.*
以实际包含
[myDriver]
部分时,编写
printk(级别名称宏“实际消息”\n”)
都很烦人。然而,我想不出一个办法来做到这一点。在最好的情况下,解决方案不会强迫我更改代码中的
printk
/
pr.*
调用(对于更改的调用,这变得微不足道)

这可能吗?(由于我包括了其他标题,而这些标题又包括
printk
标题,因此将始终对其进行定义,这排除了在不同so答案中建议的不链接到原始标题的可能性)

当前的驱动程序不支持此文本的原因有哪些?(是否有其他方法按驱动程序过滤dmesg?)


我有点了解
dev\u dbg
,但我没有找到任何针对警告的特定开发工具,因此我将使用
printk
/
pr\u err

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

例:

或者,您可以使用
dev\u warn()

例:

是否有其他方法按驱动程序过滤dmesg

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

相关答案(在中找到)是定义pr\U fmt(代码来自上面链接的重复问题):

/*位于文件顶部,在任何包含之前*/
#定义pr_fmt(fmt)KBUILD_MODNAME:“fmt
#包括
另外请注意,如果我包含变量,则有时
pr\u fmt
不会自动应用于我。在
printk(pr_fmt(“message%p”),(void*)ptr)中手动使用
修复了这些情况,并遵守了定义
pr_fmt的惯例


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

虽然标准格式的输入和推理很有帮助,但我认为没有更简单的方法,可以将
pr_调试(“Message”)
转换为
pr_调试(“MyDriver:Message”)
?这是问题的主要部分。也许你可以做一个简单的文本替换<代码>%s/pr\u debug(“/pr\u debug”(/MyDriver/gc“)使用您最喜欢的编辑器。可能重复的
pr\u debug()
替代版本是
dev\u dbg()
(in);但有些人看不出它们是相同的,就不应该编写内核代码。@artlessnoise尽管
pr_debug
dev_debug
非常相似,但我认为还是应该区分开来,无论是因为实现可能会改变,还是因为实现可能会改变。这也是内核有许多宏的原因至少,只需访问一个结构成员;分离接口和实现。虽然直接访问现在是一样的,但以后可能会改变并得到改进。@CL很好地发现了,它有我想要的答案。
 pr_debug("kvm: matched tsc offset for %llu\n", data);
 dev_warn(&adap->dev, "Bus may be unreliable\n");
/* At the top of the file, before any includes */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/printk.h>