Linux内核学习笔记:动态输出调试

上篇说到printk调试,但printk是 全局的 ,只能设置输出等级。而动态输出可以动态选择打开某个内核子系统的输出,可以有选择性地打开某些模块的输出。
配置内核编译选项要使用动态输出,必须在配置内核时打开config_dynamic_debug宏。内核代码里使用大量pr_debug()/dev_dbg()函数来输出信息,这些就使用了动态输出。
需要打开的内核配置选项:
config_debug_fs=yconfig_dynamic_debug=y
config_dynamic_debug是配置动态输出,它依赖于config_debug_fs,而config_debug_fs是debugfs 文件系统 。
打开内核配置后,我们还需要挂载debugfs 文件系统 。
debugfs文件系统挂载动态输出在debugfs文件系统中有一个control文件节点,这个文件节点记录了系统中所有使用动态输出技术的 文件名路径、输出所在的行号、模块名字和要输出的语句 。
debugfs默认会挂载到/sys/kernel/debug,如果没有挂载,可以执行以下命令挂载:
# mount -t debugfs none /sys/kernel/debug/挂载debugfs文件系统后,可以查看control节点内容:
# cat /sys/kernel/debug/dynamic_debug/control动态输出使用打开svcsock.c文件中所有的动态输出语句
# echo 'file svcsock.c +p' > /sys/kernel/debug/dynamic_debug/control打开usbcore模块中所有的动态输出语句
# echo 'module usbcore +p' > /sys/kernel/debug/dynamic_debug/control打开svc_process()函数中所有的动态输出语句
# echo 'func svc_process() +p' > /sys/kernel/debug/dynamic_debug/control打开文件路径包含usb的文件里所有的动态输出语句
# echo -n '*usb* +p' > /sys/kernel/debug/dynamic_debug/control打开系统所有的动态输出语句
# echo -n '+p' > /sys/kernel/debug/dynamic_debug/control上面是打开动态输出语句的例子,除了能输出pr_debug()/dev_dbg()函数中定义的输出信息外,还能输出一些额外信息,如函数名、行号、模块名字以及线程id等
p:打开动态输出语句f:输出函数名l:输出行号m:输出模块名字t:输出线程id另外,还可以在各个子系统的makefile中添加ccflags来打开动态输出语句
ccflags-y += -ddebugccflags-y += -dverbose_debug实际案例例如在一个led驱动中的open()、write()等函数开头添加一句pr_debug(%s enter\\n, **func **** ** );
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static int major = 0;static char kernel_buf[1024];static struct class *hello_class;#define min(a, b) (a /sys/kernel/debug/dynamic_debug/control然后执行该驱动的应用层程序,使其调用到驱动的open、write、close函数,从而执行pr_debug():
# ./hello_drv_test -w 10再查看demsg内容:
可以看到,当打开了hello_drv模块的动态输出后,驱动中的pr_debug()语句就可以正常打印了。
再看看debugfs的control节点:
# cat /sys/kernel/debug/dynamic_debug/control
control节点记录了刚刚执行pr_debug()时的文件名、所在行号、模块名、函数名和输出语句(p表示动态输出的语句)。

开关稳压器是如何构建的
X86嵌入式工控主板与ARM主板优劣势分析
英飞凌开发板模块评测任务大挑战
LED灯高压线性恒流驱动方案SM2082EDS原厂技术支持设计特点
什么是ADC (Analog to Digital Conv
Linux内核学习笔记:动态输出调试
北汽新能源与孚能科技将进行电池技术合作开发
便携迷你汽车,打破吉尼斯纪录,出厂价200英镑
国家智能汽车监管平台正式启动建设
Altium Designer是什么软件?
5G时代下的农村会是什么样的
山东能耗在线监测系统搭建,工厂耗能数据监测平台
“聚合”众力加速部署物联网生态
iPhone7芯片供应商有何新变化?
基于由神经网络架构建立的Gram矩阵的特定结构
LED封装厂旭宇光电IPO迎来新进展
Molex公司推出SolarSpec智能接线盒
微分电路基本概念和电路图解析
最适合车载LED灯驱动IC方案,稳定可靠高效率95%
数字万用表故障排除方法有那几点