1

这是一种查找在哪个函数printk中执行的方法吗?我知道我可以添加__function__到我的信息中来获取这些信息,但是我正在处理一个大项目,手动printk添加它是不可能的。printk

也许我应该在代码中添加一些宏或使用一些 linux 命令?

4

2 回答 2

2

由于我们正在讨论 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_*()家庭才有这样的设施。

于 2019-09-02T20:12:57.463 回答
0

您可以使用一些宏来执行此操作(至少使用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
于 2019-09-02T12:12:07.627 回答