目录
1.概述。
打印调试无论是内核还是用户层都是比较直接简单的调试,当然打印调试对于代码量比较庞大时,调用路径不明确时,这个打印函数就不知道要加在哪里了,不过只要你肯花时间打印应该还是可以解决的。linux内核下提供的打印函数是printk,这是一个比较裸的打印函数,回头再驱动篇会专门分析这个打印函数的内部实现。这里先不展开了,不过linux下的打印函数底层实现可以保证你无论在中断上下文还是进程上下文都是安全可靠的。方向打印吧。。。。。。
2.printk打印的实现
下面是linux下打印函数的实现链接:
printk.h - include/linux/printk.h - Linux source code (v5.14.12) - Bootlin
3.printk 变体 pr_*
除了这个标准的printk还有一些变体打印函数:pr_* 相比于printk多了打印级别,以及自定义前缀.在文件最前面重新定义pr_fmt 就可以自定义前缀,具体内核定义可以看下面的链接。内核的打印级别实现其实就是一个字符串。
/*自定义*/
#define pr_fmt(fmt) "CPU features: " fmt
/**
* pr_emerg - Print an emergency-level message
* @fmt: format string
* @...: arguments for the format string
*
* This macro expands to a printk with KERN_EMERG loglevel. It uses pr_fmt() to
* generate the format string.
*/
#define pr_emerg(fmt, ...) \
printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)
pr_emerg(), pr_alert(), pr_crit(), pr_err(), pr_warning(), pr_notice(), pr_info(), pr_cont()
4.dev_*()打印
除了pr还有这样的变体 dev_*(),dev变体应该主要用在驱动代码里,参数要求传入dev,打印的时候会打印出dev->name,凡是有驱动设备都基本会继承dev,所以这个打印在设备驱动里面非常常用,他的实现也在驱动的core文件下core.c - drivers/base/core.c - Linux source code (v5.14.12) - Bootlin。
dev_emerg(), dev_alert(), dev_crit(), dev_err(), dev_warn(),
dev_notice(), dev_info()