这是一种查找在哪个函数printk
中执行的方法吗?我知道我可以添加__function__
到我的信息中来获取这些信息,但是我正在处理一个大项目,手动printk
添加它是不可能的。printk
也许我应该在代码中添加一些宏或使用一些 linux 命令?
这是一种查找在哪个函数printk
中执行的方法吗?我知道我可以添加__function__
到我的信息中来获取这些信息,但是我正在处理一个大项目,手动printk
添加它是不可能的。printk
也许我应该在代码中添加一些宏或使用一些 linux 命令?
由于我们正在讨论 Linux 内核编程,因此有几种方法可以实现这一点。最糟糕的是定义自定义宏,您可以在其中添加额外的打印内容。现在,让我们考虑更好的方法。
方法 1.
如果您有兴趣将函数名称仅放在消息的子集上,假设出于调试目的,最好的选择是启用动态调试选项并使用特殊宏而不是直接调用printk
, 即pr_debug()
,dev_dbg()
等netdev_dbg()
。
它将允许您在运行时打开和关闭任何单个消息,同时启用或不打印__func__ 。
方法 2.
另一种方法,如果您想为宏系列启用附加参数,例如pr_*()
and 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("Hello\n");
return 0;
}
将打印(从https://tio.run/#c-gcc测试):
.code.tio.c: 12: Hello
而不仅仅是
Hello