Linux 内核动态打印机制详解

Linux 内核动态打印机制详解

在 Linux 内核开发和调试过程中,日志输出是最重要的工具之一。常见的日志接口包括 pr_info()pr_err()pr_debug() 以及设备相关的 dev_info()dev_err()dev_dbg() 等。其中,dev_dbg()pr_debug() 默认情况下往往不会直接打印出来,它们依赖于 动态调试 (Dynamic Debug) 机制。

一、CONFIG_DYNAMIC_DEBUG 配置

要使用动态调试,首先需要在内核编译时启用相关配置:

text 复制代码
CONFIG_DYNAMIC_DEBUG=y
CONFIG_DEBUG_FS=y

其中:

  • CONFIG_DYNAMIC_DEBUG:开启动态调试支持。
  • CONFIG_DEBUG_FS:提供 debugfs 文件系统接口,动态调试依赖它来控制。

编译完成后,确保系统挂载了 debugfs:

bash 复制代码
mount -t debugfs none /sys/kernel/debug

二、动态调试的控制接口

动态调试的核心接口是:

text 复制代码
/sys/kernel/debug/dynamic_debug/control

这个文件包含了所有支持动态调试的调用点(例如 dev_dbg()),可以通过写入规则来开启或关闭。

常见用法

  1. 按文件启用
bash 复制代码
echo 'file drivers/usb/core/hub.c +p' > /sys/kernel/debug/dynamic_debug/control

开启 hub.c 文件中所有 dev_dbg() 的打印。

  1. 按函数启用
bash 复制代码
echo 'func hub_power_on +p' > /sys/kernel/debug/dynamic_debug/control

只开启 hub_power_on() 函数中的调试信息。

  1. 按模块启用
bash 复制代码
echo 'module usbcore +p' > /sys/kernel/debug/dynamic_debug/control

开启 usbcore 模块的所有调试信息。

  1. 按行号范围启用
bash 复制代码
echo 'file hub.c line 880-900 +p' > /sys/kernel/debug/dynamic_debug/control

只开启指定行号范围内的调试信息。

标志说明

  • +p:启用打印
  • -p:关闭打印
  • +f:显示函数名
  • +m:显示模块名
  • +l:显示行号

三、启动参数方式

除了运行时控制,还可以在内核启动参数中直接启用:

text 复制代码
dyndbg="file drivers/usb/core/hub.c +p"

这样系统启动时就会自动打开对应文件的调试日志。

四、模块加载参数

对于可加载模块,可以在 modprobe 时指定:

bash 复制代码
modprobe mydriver dyndbg="file mydriver.c +p"

五、日志等级与显示

dev_dbg() 属于 KERN_DEBUG 级别日志,如果要在控制台看到,需要调整 loglevel:

bash 复制代码
dmesg -n 8

否则日志只会保存在内核缓冲区中,通过 dmesg 查看。

相关推荐
光影少年18 小时前
前端SSR和ssg区别
前端·vue.js·人工智能·学习·react.js
广州华水科技18 小时前
北斗形变监测传感器在水库安全监测中的应用与发展
前端
楼兰公子18 小时前
读取rpi摄像头
linux·服务器·算法
MIXLLRED18 小时前
Ubuntu22.04 + ROS2 Humble + RealSense D435i 部署VINS-Fusion视觉惯性SLAM
ubuntu·slam·d435i·ros2·humble·vins
李景琰18 小时前
Debian12安装配置Mqtt之EMQX
linux·运维·服务器
测试员周周18 小时前
【AI测试系统】第1篇:LangGraph 实战:用 State Graph 搭建 AI测试流水线(4 步编排 + RAG 增强 + 完整代码)
linux·windows·python·功能测试·microsoft·单元测试·多轮对话
凯瑟琳.奥古斯特18 小时前
Bootstrap快速上手指南
开发语言·前端·css·bootstrap·html
不做无法实现的梦~18 小时前
PX4 机载电脑 Linux 环境安装、串口、网络、ROS 完整配置
linux·运维·网络
嵌入式×边缘AI:打怪升级日志18 小时前
嵌入式Linux开发(了解交叉编译工具链的组成)
java·linux·运维
祖国的好青年18 小时前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js