【问题标题】:How to avoid quotes ("...") in shortcut-ed printk Macros inside Linux Kernel Modules如何在 Linux 内核模块内的快捷方式的 printk 宏中避免引号(“...”)
【发布时间】:2020-05-12 08:55:14
【问题描述】:

我为 Linux 内核 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"

您知道如何避免这些多余的引号吗?

有关完整文件,请查看HeaderSource 文件。

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

【问题讨论】:

  • 去掉#format前面的#?那你为什么把它加在那里?在模块中,您应该在模块顶部执行 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 以向模块的输出添加前缀(或其他任何内容)。
  • @KamilCuk 谢谢,是的,从格式中删除 # 就可以了。想知道为什么我把它放在首位,猜想我不太确定这三个严重性 "%s: " #format "\n" 表达式将如何连接。不知道内核中使用了 pr_fmt,所以猜测这是给 printk 加前缀的方法。如果你愿意,请继续写一个小答案,我会接受的:)

标签: c linux linux-kernel c-preprocessor printk


【解决方案1】:

您在宏替换中多了一个#。只需删除它 - format 应该已经是一个字符串:

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

为了在内核中添加一些值,应该使用 pr_fmt 宏,例如 hereherebasically examples everywhere

【讨论】:

    猜你喜欢
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多