Linux驱动调试主要的途径是靠打印输出,这里介绍动态调试法。
1.Linux驱动调试信息输出
目前驱动代码中,已不建议直接使用printk()
直接添加打印调试信息,而是使用dev_info()
,dev_dbg()
,dev_err()
之类的函数代替,这些dev_xxx()函数
本质还是使用printk()
打印,但是相比起printk():
1)支持打印模块信息,dev信息
2)支持动态调试(dynamic debug)方式
dev_info():启动过程、或者模块加载过程等“通知类”信息,一般只会通知一次,例如probe()函数;
dev_dbg():一般使用在普通错误,如-EINVAL、-ENOMEM等errno发生处,用于调试;
dev_err():一般使用在严重错误,尤其是用户无法得到errno的地方,或者程序员不容易猜测系统哪里出了问题的地方;
2.动态调试
1)打开kernel动态调试开关
编译kernel时,make menuconfig
选中Enable dynamic printk() support
及Debug Filesystem,如下图(kernel version:4.9.253)
2)输出调试信息
su root
echo file <xxx.c> +p > /sys/kernel/debug/dynamic_debug/control
在操作驱动程序过程中,可以通过
sudo dmesg
查看调试信息输出
注意:xxx.c为待调试的驱动程序文件名,不要写错。dmesg输出的为dev_dbg()的信息
3)禁止调试信息
echo file <xxx.c> -p > /sys/kernel/debug/dynamic_debug/control
3.打印调试跟踪信息
su root
cat /sys/kernel/debug/tracing/trace