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

时间:2018-05-24 08:28:53

标签: linux debugging kernel driver trace

是否有一种最简单的方法可以启用Linux内核驱动程序dev_dbg调试消息(实际上它是trace样式消息),希望不会搞乱内核修补/重新编译或驱动程序实现像debugfs这样的东西?也许有一种方法可以在内核中启用SIMPLE(比如一个标志?)来触发特定的驱动程序或所有驱动程序dev_dbg(它可以用`dmesg | grep" driverName"进行过滤)输出?

内核版本为4.14。 根本没有运行syslog/daemonlog/system日志。没有网络接口,只有单个串口可用。目标系统非常慢并且非常紧凑所以没有办法添加系统日志/等等,除了dmesg之外什么都没有看到线条输出的确如此:

dev_dbg(&client->dev, "bla bla bla\n");

有些帖子已经建议为debug内核参数添加bootargs关键字但遗憾的是还不够。

dev_info这样的输出正在进入dmesg而没有任何问题,所以它肯定是接近的。感谢

5 个答案:

答案 0 :(得分:3)

接收dev_dbg消息而不安装/配置syslog / etc的最简单方法似乎需要执行以下步骤:

  1. debug密钥提供给bootargs内核参数

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

  3. 在内核启动时,提示似乎通过执行dmesg -n 8echo 8 > /proc/sys/kernel/printk

  4. 启用调试级别消息
  5. 如果模块带有insmod <driver name>modprobe <driver name>命令,或者驱动程序已集成到内核中,则插入命令可能会有所不同,从而加载驱动程序。

  6. 关于如何为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从未执行过,因为某些内核预期的服务结构信息丢失或有故障

答案 1 :(得分:3)

我使用以下命令打开Android的内核日志。我认为对于Linux来说应该可以工作:

echo 'file <driverfilename.c> +p'>/sys/kernel/debug/dynamic_debug/control

您可以在“ dmesg”中看到驱动程序日志

谢谢 MJ

答案 2 :(得分:2)

您需要执行以下三个步骤。

1。确保您的内核符合CONFIG_DYNAMIC_DEBUG = y

cat /proc/config.gz | gunzip | grep CONFIG_DYNAMIC_DEBUG

如果没有,则使用CONFIG_DYNAMIC_DEBUG = y

重新编译内核。

2)启动后,检查debugfs是否安装在某个地方。

mount | grep debugfs

大多数情况下,如果没有将其挂载在/ sys / kernel / debug中,则可以手动将其挂载在如下所示的任何地方

mount -t debugfs none /sys/kernel/debug

3)现在启用您需要dev_dbg()日志的文件名。

echo 'file <driverfilename.c> +p'>/sys/kernel/debug/dynamic_debug/control

https://www.kernel.org/doc/html/v4.11/admin-guide/dynamic-debug-howto.html处还有更多dynamic_debug/control可用的命令

现在您应该进行调试。

如果您仍然看不到消息,请启用Prink Level

echo "8    4    1    7" > /proc/sys/kernel/printk

如果未设置CONFIG_DYNAMIC_DEBUG选项,则dev_dbg / pr_debug可以转换为具有KERN_DEBUG级别的普通printk()语句。

但是,为此,您需要在文件开头添加#define DEBUG。 或在编译时添加-DDEBUG 或启用CONFIG_ [SUBSYSTEM] _DEBUG = y

答案 3 :(得分:0)

您可以通过执行以下命令来手动挂载调试文件系统:

  

mount -t debugfs none / sys / kernel / debug

完成后,做:

  

ls / sys / kernel / debug

所有调试信息和消息将存储在此处,而无需重新编译。

此外,您可以在/ etc / fstab下添加此文件,以使重新引导时挂载自动进行。

...如果仍然要重新编译内核,则可以在“内核黑客”下启用“ [*]调试文件系统”

祝你好运,我希望一切顺利。

答案 4 :(得分:0)

在内核参数中添加“ debug”会将内核事件日志级别提升到KERN_DEBUG(级别7),这将使用整个内核代码的调试消息来污染kmsg缓冲区,这通常不是调试内核时我们想要的模块。当通过/ proc / sys / kernel / printk更改当前内核日志级别时,也是如此。

要仅对内核模块获得高于KERN_ERR的所有日志级别的细粒度控制,而又不弄乱全局内核日志级别的配置,只需在模块代码的开头添加以下几行:

#undef dev_dbg
#undef dev_info
#undef dev_warn
#undef dev_notice

#define dev_dbg dev_err
#define dev_info dev_err
#define dev_warn dev_err
#define dev_notice dev_err