Linux的Dynamic debug功能

现代 Linux 内核支持动态调试(Dynamic debug)功能,该功能允许我们动态启用或禁用内核调试打印代码,以获取更多内核信息。动态调试会生成一份当前运行内核中所有 "打印调试语句"(prdbgs)的目录,你可以运行命令 cat /proc/dynamic_debug/control 来查看系统中所有可用项。

1.示例

以启用 / 禁用 amdgpu 内核调试 / KFD 日志为示例,可直接在终端执行:

bash 复制代码
echo "module amdgpu +pfl" | sudo tee /sys/kernel/debug/dynamic_debug/control
echo "module amdgpu +plmf" | sudo tee /sys/kernel/debug/dynamic_debug/control
echo 'module amdgpu +flpt' | sudo tee /sys/kernel/debug/dynamic_debug/control
echo 'module amdgpu -flpt' | sudo tee /sys/kernel/debug/dynamic_debug/control
echo "module amdgpu file amdgpu_object.c +p" | sudo tee /sys/kernel/debug/dynamic_debug/control

其中,sudotee 结合使用的作用是提升权限(操作 /sys/kernel/debug/dynamic_debug/control 需权限),同时还能在终端中显示该命令。

2. 字段作用分析

2.1 符号(+/-)说明

符号(+/-)代表一种变更操作,后接一个或多个标志字符。变更操作分为以下几种:

  • -:移除指定标志

  • +:添加指定标志

  • =:将标志设置为指定值

2.2 核心标志(flags)含义

  • p:启用 pr_debug () 调用点(即开启对应调试打印)

  • _:移除标志(用于清除已设置的标志)

2.3 装饰器标志(Decorator flags)含义

这类标志会按顺序为调试信息前缀添加额外内容,便于定位问题:

  • t:包含线程 ID,中断场景下显示为 <intr>

  • m:包含模块名称

  • f:包含函数名称

  • s:包含源文件名

  • l:包含行号

实用建议:在多数情况下,执行 echo "module amdgpu +p ..."(无需额外标志)是开启调试排查的良好起点,可先获取基础调试信息再逐步细化。

设置成功后,运行程序,在终端使用dmesg命令查看实时查看输出,nice的很。

3. 编码规范

要在驱动代码中使用 Linux 的动态调试(Dynamic Debug)功能,需要在代码中使用特定的调试打印函数,并遵循一定的编码规范。以下是具体实现方法:

3.1 包含必要的头文件

首先需要包含动态调试所需的头文件:

cpp 复制代码
#include <linux/dynamic_debug.h>

3.2 使用调试打印函数

动态调试依赖内核提供的 pr_debug() 系列函数,而非普通的 printk()。常用函数包括:

  • pr_debug(const char *fmt, ...):基础调试打印

  • dev_dbg(struct device *dev, const char *fmt, ...):带设备信息的调试打印

  • netdev_dbg(struct net_device *dev, const char *fmt, ...):网络设备专用调试打印

示例:

cpp 复制代码
// 在amdgpu驱动中使用
pr_debug("amdgpu: 初始化PCI设备 %p\n", pdev);

// 带设备信息的调试
dev_dbg(adev->dev, "显存大小: %lu MB\n", size / (1024*1024));

// 条件判断下的调试打印
if (ret != 0) {
    pr_debug("amdgpu: 函数 %s 执行失败,返回值: %d\n", __func__, ret);
}

4. 编译配置

确保内核配置中开启了动态调试支持:

复制代码
CONFIG_DYNAMIC_DEBUG=y

驱动编译时不需要特殊的编译选项,动态调试的开关完全由运行时控制。

推荐阅读官方的文档:https://www.kernel.org/doc/html/latest/admin-guide/dynamic-debug-howto.html

相关推荐
盟接之桥2 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
忆~遂愿3 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
湘-枫叶情缘3 小时前
1990:种下那棵不落叶的树-第6集 圆明园的对话
linux·系统架构
Fcy6483 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满3 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠4 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Gary Studio4 小时前
rk芯片驱动编写
linux·学习
mango_mangojuice4 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
Harvey9034 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
A星空1235 小时前
一、Linux嵌入式的I2C驱动开发
linux·c++·驱动开发·i2c