这是一种查找printk
在哪个函数中执行的方法吗? 我知道我可以在我的printk
中添加__function__
来获取这些信息,但我正在处理大项目,手动将其添加到所有printk
是不可能的。
也许我应该在代码中添加一些宏或使用一些 linux 命令?
由于我们正在谈论Linux内核编程,因此有几种方法可以实现此目的。最糟糕的是定义自定义宏,您可以在其中添加其他内容进行打印。现在,让我们考虑更好的方法。
方法1.如果您有兴趣将函数名称仅放在消息的子集上,假设出于调试目的,最好的选择是启用动态调试选项并使用特殊的宏而不是直接调用printk
,即pr_debug()
、dev_dbg()
、netdev_dbg()
等。
它将允许您在运行时打开和关闭任何一条消息,以及是否启用__func__打印。
方法2.另一种方法是,如果要为宏族启用其他参数,例如pr_*()
和dev_*()
,您可以在每个模块的最开头定义特殊的宏,或者如果需要,可以从标头中包含,尽管它必须是每个 C 文件中的第一个。请参阅ipmi_msghandler.c中的示例:
#define pr_fmt(fmt) "%s" fmt, "IPMI message handler: "
#define dev_fmt pr_fmt
它可以很容易地转换为
#define pr_fmt(fmt) "%s(): " fmt, __func__
#define dev_fmt pr_fmt
此方法的好处是可以为不同的模块设置不同的前缀,例如使用它们的文件名,并且它将应用于同一宏系列的所有消息。
缺点是只有pr_*()
和dev_*()
家庭才有这样的设施。
你可以用一些宏来做到这一点(至少用printf
,但原理与printk
相同(:
#include <stdio.h>
/* redefine printf for the rest of file. */
#define printf(...)
do {
printf("%s: %d:t", __FILE__, __LINE__);
printf(__VA_ARGS__);
} while (0)
/* after this point, each call to printf will be replaced by two. */
int main(void)
{
printf("Hellon");
return 0;
}
将打印(从 https://tio.run/#c-gcc 测试(:
.code.tio.c: 12: Hello
而不仅仅是
Hello