是否有一种最简单的方法可以启用 linux 内核驱动程序 dev_dbg
调试消息(实际上是 trace
样式消息),希望不会弄乱内核补丁/重新编译或驱动程序实现额外的东西像 debugfs
?也许有一种方法可以在内核中启用一些简单的东西(比如一个标志?)触发特定驱动程序或所有驱动程序 dev_dbg(它可以使用 `dmesg|grep “driverName” 过滤)输出?
内核版本是 4.14
。根本没有 syslog/daemonlog/system
日志正在运行。没有网络接口,只有一个串行端口可用。目标系统非常慢而且非常紧凑,所以没有办法添加 syslog/etc,除了 dmesg 之外什么都没有,可以很好地看到如下行的输出:
dev_dbg(&client->dev, "bla bla bla\n");
一些帖子已经建议为 bootargs
内核参数添加 debug
关键字不幸的是还不够。
像 dev_info
这样的输出正在毫无问题地进入dmesg,所以它肯定是接近的。谢谢
原文由 Oleg Kokorin 发布,翻译遵循 CC BY-SA 4.0 许可协议
在不安装/配置系统日志/等的情况下接收
dev_dbg
消息的最简单方法似乎需要执行以下步骤:提供
debug
key intobootargs
内核参数在驱动程序文件的第一行附加
#define DEBUG
- 如果驱动程序是单个文件并且正在使用通用 Makefile,或者在CC
构建中附加-DDEBUG
如果驱动程序包含多个源文件并且通常具有它自己的 Makefile,则选项在内核启动后,提示似乎通过执行
dmesg -n 8
或echo 8 > /proc/sys/kernel/printk
来启用调试级别消息如果模块使用命令
insmod <driver name>
或modprobe <driver name>
或者如果驱动程序集成到内核中,则加载驱动程序,插入命令可能会有所不同。关于如何为
i2c
总线子系统分配内核集成驱动程序的示例:echo <driver name> <i2c bus address> > /sys/bus/i2c/devices/i2c-0/new_device
旁注:
如果 DTS 将有驱动记录分配,手动重复驱动分配将导致错误 - 如果是
i2c
子系统 - 错误EBUSY
(-16),驱动将被分配方式在命令提示符之前和 dmesg 消息将被限制为默认级别(通常仅dev_info
)如果驱动程序已由
DTS
分配,并且无法从树源中临时排除它 - 在debug
之后再次分离和重新连接它是有用的(跟踪)级别消息已激活对于 i2c 子系统,它需要执行一个命令:
echo <driver name> > /sys/bus/i2c/drivers/<drivername>/unbind
然后
echo <driver name> > /sys/bus/i2c/drivers/<drivername>/bind
警告:
内核驱动程序跟踪机制将无助于调试内部驱动程序配置不当或缺少服务结构。即,如果驱动程序已加载但保持沉默且没有跟踪消息,则意味着
probe
由于某些内核预期的服务结构信息丢失或错误而从未执行过