linux代码中pr_fmt是什么意思
接上一篇,在看clang.c时,发现最上面有一句
#define pr_fmt(fmt) "gcov: " fmt
这个是干嘛的? 乍一看没看明白,而且在kernel/gcov中也没有找到pr_fmt的使用
其实,这个的使用在include/linux/printk.h中
首先几个可以看出来带有与日志级别匹配后缀的几个函数,从这里也可以看出来pr应该是print的意思
#define pr_emerg(fmt, ...) \
pr_printk_hash(KERN_EMERG, fmt, ##__VA_ARGS__)
#define pr_alert(fmt, ...) \
pr_printk_hash(KERN_ALERT, fmt, ##__VA_ARGS__)
#define pr_crit(fmt, ...) \
pr_printk_hash(KERN_CRIT, fmt, ##__VA_ARGS__)
#define pr_err(fmt, ...) \
pr_printk_hash(KERN_ERR, fmt, ##__VA_ARGS__)
#define pr_warning(fmt, ...) \
pr_printk_hash(KERN_WARNING, fmt, ##__VA_ARGS__)
#define pr_warn pr_warning
#define pr_notice(fmt, ...) \
pr_printk_hash(KERN_NOTICE, fmt, ##__VA_ARGS__)
#define pr_info(fmt, ...) \
pr_printk_hash(KERN_INFO, fmt, ##__VA_ARGS__)
上面几个函数都调用了pr_printk_hash,而pr_printk_hash调用了printk,以及将pr_info传入来的fmt使用pr_fmt处理后作为参数
嘿,这不就是咱们熟悉的领域了吗,弄了半天就是printk呗
#define pr_printk_hash(level, format, ...) \
printk(level pr_fmt(format), ##__VA_ARGS__)
所以,回去kernel/gcov中看一下如何使用的,例如kernel/gcov/fs.c中有
pr_warn("out of memory\n");
按照上面的宏定义展开,最终能够得到
pr_printk_hash(KERN_WARNING, "out of memory\n")
printk(KERN_WARNING, pr_fmt("out of memory\n"))
printk(KERN_WARNING, "gcov: out of memory\n")
害,就这
不过这样一封装确实用起来方便多了,如果自己写一个软件需要组件log的话可以参考这种