是否有一种最简单的方法来启用 linux 内核驱动程序 dev_dbg
调试消息(实际上它是一个 trace
样式的消息),希望不会搞乱内核修补/重新编译或驱动程序实现了一些额外的东西,比如 debugfs
?也许有一种方法可以在内核中启用一些简单的东西(比如一个标志?)触发特定驱动程序或所有驱动程序 dev_dbg(它可以用 `dmesg|grep "driverName")输出过滤?
内核版本是4.14
。
根本没有 syslog/daemonlog/system
日志在运行。没有网络接口(interface),只有一个串行端口可用。目标系统非常慢而且非常紧凑,所以没有办法添加 syslog/etc,除了 dmesg 什么都没有,在那里可以很好地看到像这样的行的输出:
dev_dbg(&client->dev, "bla bla bla\n");
一些帖子已经建议为 bootargs
内核参数添加 debug
关键字,不幸的是这还不够。
dev_info
之类的输出毫无问题地进入了 dmesg,所以它绝对接近。谢谢
最佳答案
最简单的接收方式dev_dbg
无需安装/配置 syslog/etc 的消息,似乎有必要执行以下步骤:
提供
debug
键入bootargs
内核参数追加
#define DEBUG
在驱动程序文件的第一行 - 如果驱动程序是单个文件并且使用通用 Makefile,或附加-DDEBUG
在CC
里面如果驱动程序包含多个源文件并且通常有自己的 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
之后再次分离和重新连接它很有用。 (trace) 级消息激活
对于 i2c 子系统,它需要执行一个命令:
echo <driver name> > /sys/bus/i2c/drivers/<drivername>/unbind
然后
echo <driver name> > /sys/bus/i2c/drivers/<drivername>/bind
警告:
内核驱动程序跟踪机制无助于调试内部驱动程序配置不当或缺少服务结构。即,如果驱动程序已加载但保持沉默且没有跟踪消息,则表示 probe
由于某些内核预期的服务结构信息丢失或错误而从未执行过
关于linux - 启用 linux 内核驱动程序 dev_dbg 调试消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50504516/