活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…

| 名称 | 解释 |
|---|---|
| Log Buffer | 该Buffer里的内容可以存储在/proc/kmsg |
| Console | Console的实现有很多,目前主要用到的是用来调试的串口 UART Console |
| RAM Console | 允许将调试日志信息写入一个被成为RAM Console的设备 |
printk的调试是全局的,调试等级从0到7,一共8个等级,优先级由0-7依次变低。
可通过操作/proc/sys/kernel/printk来查看调整该等级的设定,如下:
cat /proc/sys/kernel/printk

打开所有内核调试打印信息
echo 8 > /proc/sys/kernel/prink

相对于printk的使用,printk都是预先编码编译后运行,对于我们需要在系统运行时候想去动态的打开关闭某些调试信息是无法做到的,这时候我们可以使用动态打印,动态打印的基础开关使用依赖于宏CONFIG_DYNAMIC_DEBUG
如何使用?
| 需求 | 实现 |
|---|---|
| 使能一个文件中所有动态打印语句 | echo -n “file gadget.c +p” > |
| 使能一个模块中所有动态打印语句 | echo “module dwc3 +p” > |
| 使能一个函数中所有的动态打印语句 | echo “func svc_process +p” > |
| 使能文件路径中包含 usb的 文件所有的动态打印语句 | echo -n "*usb* " +p > |
ps:关于上面部分的动态打印语句的需求例子,除了能打印pr_debug()/dev_dbg()函数中定义的输出外,还能打印一些额外的如动态打印语句 (p)、函数名 (f)、行号 (l)、模块名字 (m)和线程ID (t)等。
Q:如何将dynamic动态打印转为printk正常的静态打印?
A:
#undef dev_dgb
#define dev_dbg dev_info
#undef pr_debug
#define pr_debug pr_info
dump_stack是kernel调试中的瑞士军刀,很方便的一个函数接口,在我看来它最方便的地方就是能从一个函数中找到它从哪里来–追寻函数调用关系。如下:
