启用 linux 内核驱动程序 dev_dbg 调试消息

新手上路,请多包涵

是否有一种最简单的方法可以启用 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 许可协议

阅读 1.4k
1 个回答

在不安装/配置系统日志/等的情况下接收 dev_dbg 消息的最简单方法似乎需要执行以下步骤:

  1. 提供 debug key into bootargs 内核参数

  2. 在驱动程序文件的第一行附加 #define DEBUG - 如果驱动程序是单个文件并且正在使用通用 Makefile,或者在 CC 构建中附加 -DDEBUG 如果驱动程序包含多个源文件并且通常具有它自己的 Makefile,则选项

  3. 在内核启动后,提示似乎通过执行 dmesg -n 8echo 8 > /proc/sys/kernel/printk 来启用调试级别消息

  4. 如果模块使用命令 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 由于某些内核预期的服务结构信息丢失或错误而从未执行过

原文由 Oleg Kokorin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题