linux内核调试之PRINTXXX

 目录

1.概述。

2.printk打印的实现      

3.printk 变体 pr_*

4.dev_*()打印    

5.特殊的打印

6.动态调试打印


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() 

5.特殊的打印

6.动态调试打印

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值