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

标签 linux debugging kernel driver trace

是否有一种最简单的方法来启用 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 的消息,似乎有必要执行以下步骤:

  1. 提供 debug键入 bootargs内核参数

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

  3. 在内核启动时出现提示,通过执行 dmesg -n 8 来启用调试级别消息或 echo 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 之后再次分离和重新连接它很有用。 (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/

相关文章:

linux - 使用 tar 将 Linux 主目录的内容归档

asp.net - 使用 Visual Studio 2008 调试 Sitecore 6

.net - 调试 .net 编译器

java - 在 linux 上用 java 读取远程文件

linux - 如何从现有脚本创建 shell 脚本?

java - 当我从 JDK 调试类文件时,为什么 Eclipse 不显示局部变量值?

c - GCC-内核版本不匹配

linux - 有没有办法让 Splint 或类似的静态检查器与 Linux 内核模块一起工作?

c - 将完整文件名拆分为多个部分

linux - crosstool-ng 无法获取 linux tarball