8 动态调试 - 内核调试消息 #
动态调试是 Linux 内核中的一项强大的调试功能,它允许您在运行时启用和禁用调试消息,而无需重新编译内核或重引导系统。
您可以在以下几种情况下使用动态调试,例如:
内核问题查错
为新硬件开发驱动程序
跟踪和审计安全事件
8.1 动态调试的优势 #
下面列出了动态调试的某些优势:
- 实时调试
动态调试支持在不重引导系统的情况下调试消息。这种实时功能对于诊断生产环境中的问题至关重要。
- 选择性调试
您可以为内核的特定部分甚至单个模块启用调试消息,从而将重点放在相关信息上。
- 性能微调
使用动态调试来监控和优化内核性能,只需根据当前的分析要求选择性地启用或禁用调试消息。
8.2 检查动态调试的状态 #
默认安装的受支持内核版本已内置动态调试。要检查动态调试的状态,请以 root 用户身份运行以下命令:
#
zcat /proc/config.gz | grep CONFIG_DYNAMIC_DEBUG
如果动态调试已编译到内核中,您应该看到类似于以下内容的输出:
CONFIG_DYNAMIC_DEBUG=y CONFIG_DYNAMIC_DEBUG_CORE=y
8.3 使用动态调试 #
要在正在运行的内核中启用特定的调试消息或日志,您可以使用 echo
命令向 /sys/kernel/debug/dynamic_debug/control
文件写入数据。
以下示例说明了动态调试的一些简单用法:
动态调试依赖于内核代码中所嵌入的特定调试宏,例如 pr_debug
。内核开发人员使用这些宏将调试消息插入到代码中。
本节中的示例假设 pr_debug
宏正常工作,因为允许对正在运行的内核进行动态调试。
- 为特定内核源代码文件启用调试消息
要为特定内核源代码文件启用调试消息,请使用以下示例:
#
echo "file FILE_NAME.c +p" > /sys/kernel/debug/dynamic_debug/control
- 为特定内核模块启用调试消息
要为特定内核模块启用调试消息,请使用以下示例:
#
echo "module MODULE_NAME +p" > /sys/kernel/debug/dynamic_debug/control
- 禁用调试消息
要禁用以前为特定内核源代码文件或内核模块启用的调试消息,请运行带有
-p
选项的echo
命令。例如:#
echo "file FILE_NAME.c -p" > /sys/kernel/debug/dynamic_debug/control
#
echo "module MODULE_NAME -p" > /sys/kernel/debug/dynamic_debug/control
有关动态调试及其用例的详细信息,请参见其官方文档。
8.4 查看动态调试消息 #
您可以运行 dmesg
并通过 grep
过滤输出,来查看根据启用的配置生成的动态调试消息。例如:
#
dmesg | grep -i "FILE_NAME.c"
或者,要在系统消息生成时持续监控系统消息,可以使用带有 -f
选项的 tail
命令:
#
tail -f /var/log/messages