1

我为 Linux Kernel printk创建了一组快捷方式宏, 以模块名称为前缀,并为严重性设置一组别名。

#define _pp(severity, format, args...) \
  printk(severity "%s: " #format "\n", THIS_MODULE->name, ##args)

#define pp_warn(args...) _pp(KERN_WARNING, args)
#define pp_note(args...) _pp(KERN_NOTICE, args)
#define pp_info(args...) _pp(KERN_INFO, args)

像这样使用这些宏:

static int __init pretty_printk_demo_init(void) {

  pp_warn("Warning severity");
  pp_warn("Warning, checking arguments, %s and %i", "DDD", 44);

}

现在的问题是内核环缓冲区中的最终输出以下列方式被引用:

[  470.819436] pp_demo_module: "Warning severity"
[  470.819438] pp_demo_module: "Warning, checking arguments, DDD and 44"

你知道如何避免这些额外的引号吗?

有关完整文件,请查看标题文件。

非常感谢您抽出宝贵时间并期待一个可能的解决方案。

4

1 回答 1

3

你有一个额外#的宏替换。只需删除它 -format应该已经是一个字符串:

#define _pp(severity, format, args...) \
  printk(severity "%s: " format "\n", THIS_MODULE->name, ##args)

为了在内核中添加一些值,该pr_fmt宏是要使用的,例如此处此处基本上是随处可见的示例

于 2020-05-12T12:41:01.177 回答