Ole*_*rin 21 linux debugging trace kernel driver
有没有一种最简单的方法来启用 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");
不幸的是,一些帖子已经建议debug为bootargs内核参数添加关键字还不够。
输出像dev_info进入 dmesg 没有问题,所以它绝对接近。谢谢
Ole*_*rin 14
dev_dbg无需安装/配置 syslog/etc即可接收消息的最简单方法,似乎需要执行以下步骤:
提供内核参数的debug密钥bootargs
附加#define DEBUG在驱动程序文件的第一行 - 如果驱动程序是单个文件并且使用公共 Makefile,或者如果驱动程序包含多个源文件并且通常具有自己的 Makefile ,则附加-DDEBUG在CC构建选项中
内核启动后,出现提示以通过执行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由于某些内核预期的服务结构信息丢失或错误而从未执行过
我使用以下命令打开 Android 的内核日志。我认为对于 Linux 来说它应该可以工作:
echo 'file <driverfilename.c> +p'>/sys/kernel/debug/dynamic_debug/control
Run Code Online (Sandbox Code Playgroud)
您可以在“dmesg”中看到驱动程序日志
谢谢 MJ
您需要遵循以下三个步骤。
1.确保你的内核符合CONFIG_DYNAMIC_DEBUG=y
cat /proc/config.gz | gunzip | grep CONFIG_DYNAMIC_DEBUG
Run Code Online (Sandbox Code Playgroud)
如果没有,则使用 CONFIG_DYNAMIC_DEBUG=y 重新编译内核
2) 启动后检查 debugfs 是否安装在某处。
mount | grep debugfs
Run Code Online (Sandbox Code Playgroud)
大多数情况下它会挂载在 /sys/kernel/debug 中,如果没有,那么您可以手动将其挂载到如下所示的任何位置
mount -t debugfs none /sys/kernel/debug
Run Code Online (Sandbox Code Playgroud)
3) 现在启用需要 dev_dbg() 日志的文件名。
echo 'file <driverfilename.c> +p'>/sys/kernel/debug/dynamic_debug/control
Run Code Online (Sandbox Code Playgroud)
一些命令一起玩dynamic_debug/control是在https://www.kernel.org/doc/html/v4.11/admin-guide/dynamic-debug-howto.html
现在你应该得到你的调试。
如果您仍然没有看到您的消息,请启用 prink 级别
echo "8 4 1 7" > /proc/sys/kernel/printk
Run Code Online (Sandbox Code Playgroud)
如果未设置 CONFIG_DYNAMIC_DEBUG 选项,则可以将 dev_dbg/pr_debug 转换为具有 KERN_DEBUG 级别的普通 printk() 语句。
但是为此,您需要#define DEBUG在文件开头添加。或在编译时添加 -DDEBUG 或 Enable CONFIG_[SUBSYSTEM]_DEBUG=y