news 2026/4/23 15:39:55

Dynamic Debug的原理分析:debugfs的具体应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Dynamic Debug的原理分析:debugfs的具体应用

1. 前文回顾

Linux的Dynamic debug功能简单讲了下如何使用。再来回顾下其概念和用法。
Dynamic Debug 是 Linux 内核的动态调试功能,允许在运行时动态开启/关闭特定的pr_debug()dev_dbg()输出,而无需重新编译内核。

核心特点:

  • ✅ 运行时控制:无需重启
  • ✅ 精细化控制:可按模块、文件、函数、行号过滤
  • ✅ 零性能开销:关闭时完全无开销
  • ✅ 使用 DebugFS 作为控制接口

1.1 DebugFS 控制接口

主控制文件:/sys/kernel/debug/dynamic_debug/control

# 查看所有可用的 debug 点$cat/sys/kernel/debug/dynamic_debug/control drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c:123[amdgpu]amdgpu_init=_"AMDGPU driver loaded\012"drivers/gpu/drm/amd/amdgpu/amdgpu_device.c:456[amdgpu]amdgpu_device_init=_"Device init started\012"...# 启用特定模块的所有 debug 输出$echo'module amdgpu +p'>/sys/kernel/debug/dynamic_debug/control# 启用特定文件的 debug 输出$echo'file amdgpu_ring.c +p'>/sys/kernel/debug/dynamic_debug/control# 启用特定函数的 debug 输出$echo'func amdgpu_ring_init +p'>/sys/kernel/debug/dynamic_debug/control# 禁用 debug 输出$echo'module amdgpu -p'>/sys/kernel/debug/dynamic_debug/control

2. 内核实现分析

位置:lib/dynamic_debug.c

2.1. 数据结构
/* 每个 pr_debug() 对应一个 _ddebug 结构 */struct_ddebug{constchar*modname;/* 模块名 */constchar*function;/* 函数名 */constchar*filename;/* 文件名 */constchar*format;/* 格式字符串 */unsignedintlineno:18;/* 行号 */unsignedintflags:8;/* 标志 (是否启用) */}__attribute__((aligned(8)));/* 标志定义 */#define_DPRINTK_FLAGS_PRINT(1<<0)/* 启用打印 */#define_DPRINTK_FLAGS_INCL_MODNAME(1<<1)#define_DPRINTK_FLAGS_INCL_FUNCNAME(1<<2)#define_DPRINTK_FLAGS_INCL_LINENO(1<<3)
2.2. DebugFS 文件操作
/* 读操作:显示所有 debug 点 */staticintddebug_proc_show(structseq_file*m,void*p){structddebug_iter*iter=m->private;struct_ddebug*dp=p;charflagsbuf[10];/* 格式化输出每个 debug 点的信息 */seq_printf(m,"%s:%u [%s]%s =%s \"%s\"\n",trim_prefix(dp->filename),dp->lineno,iter->table->mod_name,dp->function,ddebug_describe_flags(dp->flags,flagsbuf,sizeof(flagsbuf)),dp->format);return0;}/* 写操作:处理控制命令 */staticssize_tddebug_proc_write(structfile*file,constchar__user*ubuf,size_tlen,loff_t*offp){char*tmpbuf;intret;/* 限制输入大小 */if(len==0||len>PAGE_SIZE)return-EINVAL;/* 从用户空间复制命令 */tmpbuf=memdup_user_nul(ubuf,len);if(IS_ERR(tmpbuf))returnPTR_ERR(tmpbuf);/* 解析并应用控制命令 */ret=ddebug_exec_queries(tmpbuf,NULL);kfree(tmpbuf);if(ret<0)returnret;returnlen;}/* file_operations 定义 */staticconststructfile_operationsddebug_proc_fops={.owner=THIS_MODULE,.open=ddebug_proc_open,.read=seq_read,.llseek=seq_lseek,.release=seq_release_private,.write=ddebug_proc_write,};
2.3. 初始化
staticint__initdynamic_debug_init_debugfs(void){structdentry*dir;/* 创建 dynamic_debug 目录 */dir=debugfs_create_dir("dynamic_debug",NULL);if(!dir)return-ENOMEM;/* 创建 control 文件 */debugfs_create_file("control",0644,dir,NULL,&ddebug_proc_fops);return0;}fs_initcall(dynamic_debug_init_debugfs);

2.4 pr_debug() 宏实现

/* include/linux/dynamic_debug.h */#ifdefCONFIG_DYNAMIC_DEBUG#definepr_debug(fmt,...)\do{\staticstruct_ddebug__aligned(8)\__section("__dyndbg")descriptor={\.modname=KBUILD_MODNAME,\.function=__func__,\.filename=__FILE__,\.format=(fmt),\.lineno=__LINE__,\.flags=_DPRINTK_FLAGS_DEFAULT,\};\if(unlikely(descriptor.flags&_DPRINTK_FLAGS_PRINT))\__dynamic_pr_debug(&descriptor,pr_fmt(fmt),\##__VA_ARGS__);\}while(0)#else#definepr_debug(fmt,...)no_printk(fmt,##__VA_ARGS__)#endif

工作原理:

  1. 每个pr_debug()编译时生成一个_ddebug结构
  2. 所有_ddebug放在特殊段__dyndbg
  3. 内核启动时收集所有_ddebug结构
  4. 通过 debugfs 控制flags字段
  5. 运行时检查flags决定是否打印

使用示例

驱动代码
/* drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c */intamdgpu_ring_init(structamdgpu_device*adev,structamdgpu_ring*ring,unsignedintmax_dw,structamdgpu_irq_src*irq_src){/* 这些 pr_debug 默认不输出 */pr_debug("Initializing ring %s\n",ring->name);pr_debug("Ring size: %u DWs\n",max_dw);/* ... 初始化逻辑 ... */pr_debug("Ring %s initialized successfully\n",ring->name);return0;}
运行时控制
# 启用该文件的所有 debug 输出$echo'file amdgpu_ring.c +p'>/sys/kernel/debug/dynamic_debug/control# 现在执行操作会看到 debug 信息$dmesg|tail[123.456]amdgpu: Initializing ring gfx[123.457]amdgpu: Ring size:1024DWs[123.458]amdgpu: Ring gfx initialized successfully# 禁用$echo'file amdgpu_ring.c -p'>/sys/kernel/debug/dynamic_debug/control

高级用法

# 按行号启用$echo'file amdgpu_ring.c line 123 +p'>control# 组合条件(文件 + 函数)$echo'file amdgpu_ring.c func amdgpu_ring_init +p'>control# 格式化标志$echo'module amdgpu +pflmt'>control# +p: 启用打印# +f: 包含函数名# +l: 包含行号# +m: 包含模块名# +t: 包含线程 ID# 使用通配符$echo'file amdgpu_* +p'>control $echo'func *_init +p'>control

性能影响分析

/* 关闭时的性能开销 */if(unlikely(descriptor.flags&_DPRINTK_FLAGS_PRINT))// 仅一次位测试__dynamic_pr_debug(&descriptor,...);// 不执行/* * unlikely() 提示:分支预测优化 * 位测试:极快的 CPU 操作 * 关闭时:几乎零开销(<1 纳秒) */

与其他调试方式对比

方式运行时控制性能开销灵活性需要重启
printk
Dynamic Debug极低
Ftrace极高
条件编译 (#ifdef)

学习要点

Dynamic Debug 展示了 DebugFS 的典型应用模式:

  1. 复杂的写操作

    • 解析用户命令
    • 应用配置到内核数据结构
    • 错误处理和验证
  2. 大量数据的读操作

    • 使用 seq_file 遍历内核数据
    • 格式化输出便于阅读
  3. 运行时控制内核行为

    • 无需重启或重新加载模块
    • 即时生效
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 13:58:06

铁路信号系统维护手册智能查询——采用anything-llm实现

铁路信号系统维护手册智能查询——采用anything-LLM实现 在铁路电务段的值班室内&#xff0c;一位年轻的技术员正面对一份突发工单&#xff1a;某区段ZPW-2000A轨道电路出现红光带&#xff0c;现场反馈发送端电压正常&#xff0c;但接收端无输入。他迅速打开内网浏览器&#x…

作者头像 李华
网站建设 2026/4/23 12:10:47

LangFlow + 大模型Token售卖:按需计费的新商业模式探索

LangFlow 大模型Token售卖&#xff1a;按需计费的新商业模式探索 在AI应用开发日益普及的今天&#xff0c;一个现实问题摆在许多开发者面前&#xff1a;如何快速验证一个智能助手的想法&#xff1f;又该如何将这个原型变成可盈利的服务&#xff1f;传统的做法是组建团队、写代…

作者头像 李华
网站建设 2026/4/23 12:20:38

Open-AutoGLM模型压缩技术大揭秘,让大模型跑在千元机上

第一章&#xff1a;手机AI迎来新纪元随着芯片算力的飞跃与端侧模型的持续优化&#xff0c;智能手机正从“智能助手”迈向真正的“个人AI中枢”。新一代旗舰设备已能本地运行十亿级参数模型&#xff0c;实现语音实时翻译、图像语义理解与个性化内容生成&#xff0c;彻底摆脱对云…

作者头像 李华
网站建设 2026/4/23 11:28:55

Open-AutoGLM控制电脑到底有多强?实测数据曝光,效率提升300%的秘密

第一章&#xff1a;Open-AutoGLM控制电脑到底有多强&#xff1f; Open-AutoGLM 是一款基于自然语言理解与自动化执行的智能代理系统&#xff0c;能够通过语义解析直接操控计算机系统完成复杂任务。其核心能力在于将用户指令转化为可执行的操作流&#xff0c;覆盖文件管理、程序…

作者头像 李华
网站建设 2026/4/23 13:37:15

【大模型自动化新利器】:Open-AutoGLM的10个你必须掌握的应用场景

第一章&#xff1a;Open-AutoGLM的核心架构与技术原理Open-AutoGLM 是一个面向自动化自然语言理解与生成任务的开源大模型框架&#xff0c;其核心设计目标是实现高效的任务自适应、多模态输入解析与动态推理链构建。该架构融合了图神经网络&#xff08;GNN&#xff09;、检索增…

作者头像 李华
网站建设 2026/4/23 13:36:40

Open-AutoGLM开源网址曝光:掌握下一代AI开发工具的5个关键用法

第一章&#xff1a;Open-AutoGLM开源网址 Open-AutoGLM 是一个面向自动化自然语言处理任务的开源框架&#xff0c;旨在简化大语言模型&#xff08;LLM&#xff09;在实际业务场景中的部署与调优流程。该项目由国内开发者社区主导维护&#xff0c;托管于主流代码托管平台&#x…

作者头像 李华