C语言 如何找到哪个函数打印 printk 语句?



这是一种查找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

相关内容

  • 没有找到相关文章

最新更新