关于 kernel-debugging
面向处理内核崩溃、驱动、模块和性能问题的 Agent,提供 Linux 内核调试指南。整合现场调试、跟踪、动态日志和崩溃转储分析流程。
主要功能
- 01kgdb 与 kdb 调试
- 02使用 ftrace 和 kprobes 跟踪
- 03使用 dyndbg 控制动态日志
- 04分析 kdump 转储
- 05调整 /proc/sys 调试参数
适用场景
- 01分析内核 panic 与 oops
- 02通过 kgdb 调试驱动或模块
- 03追踪函数调用与性能问题
- 04启用驱动调试日志
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill kernel-debugging安装后在 Claude Code 中输入/kernel-debugging确认已加载。
详细介绍
内核调试
用途
指导 Agent 调试 Linux 内核:通过串口或 USB 使用 kgdb、使用 kdb 内置调试器命令、使用 ftrace 和 trace-cmd、使用 kprobes 和 kretprobes、使用动态调试(dyndbg)、使用 crash 和 makedumpfile 分析崩溃转储、设置 dmesg 日志级别,以及通过 /proc/sys 在运行时调整调试参数。
适用场景
- 内核 panic 或 oops 的调用栈不明确
- 使用 kgdb 实时调试内核模块或驱动
- 无需重新编译即可跟踪函数调用(ftrace、kprobes)
- 使用 dyndbg 启用详细的驱动日志
- 分析通过 kdump 获取的生产环境崩溃转储
- 为调试会话调整内核运行时参数
工作流
1. dmesg 和日志级别
# Kernel ring buffer
dmesg -T -l err,warn
dmesg -w # follow live
# Log level (0=emerg .. 7=debug)
cat /proc/sys/kernel/printk
# current default minimum boot-default
# 4 4 1 7
# Temporarily increase verbosity
echo 8 > /proc/sys/kernel/printk
内核 printk 级别:从 KERN_EMERG 到 KERN_DEBUG。驱动的 dev_dbg() 需要启用 dyndbg 或定义 DEBUG。
2. 通过串口使用 kgdb
内核配置:CONFIG_KGDB、CONFIG_KGDB_SERIAL_CONSOLE。
# Boot parameter (ttyS0, 115200)
kgdboc=ttyS0,115200 kgdbwait
# Or at runtime
echo ttyS0,115200 > /sys/module/kgdboc/parameters/kgdboc
echo g > /proc/sysrq-trigger # break into kgdb
GDB 主机端:
# Connect to remote serial
gdb vmlinux
(gdb) set serial baud 115200
(gdb) target remote /dev/ttyUSB0
(gdb) bt
(gdb) list *panic+0x20
USB 变体:在支持的硬件上使用 CONFIG_KGDB_KDB 和 kgdboc=usb。
3. kdb 命令
启用 CONFIG_KGDB_KDB 后,kdb 会提供内核内 Shell:
kdb commands (at SysRq break)
├── bt — stack backtrace
├── lsmod — loaded modules
├── md <addr> — memory display
├── ps — process list
├── id <cpu> — CPU registers
├── go — continue execution
└── cpu <n> — switch CPU context
# Enter kdb
echo k > /proc/sysrq-trigger
4. ftrace
# Enable function tracer
echo function > /sys/kernel/debug/tracing/current_tracer
echo 1 > /sys/kernel/debug/tracing/tracing_on
# Filter to specific function
echo schedule > /sys/kernel/debug/tracing/set_ftrace_filter
echo ':*probe_*' >> /sys/kernel/debug/tracing/set_ftrace_notrace
# Capture and read
cat /sys/kernel/debug/tracing/trace_pipe
# Disable
echo 0 > /sys/kernel/debug/tracing/tracing_on
echo nop > /sys/kernel/debug/tracing/current_tracer
# trace-cmd (userspace recorder)
trace-cmd record -p function -l schedule,do_page_fault
trace-cmd report
trace-cmd.dat # kernelshark GUI
5. kprobes 和 kretprobes
# Dynamic kprobe via debugfs
echo 'p:myprobe do_sys_open %ax %si' > /sys/kernel/debug/tracing/kprobe_events
echo 1 > /sys/kernel/debug/tracing/events/kprobes/myprobe/enable
cat /sys/kernel/debug/tracing/trace
# kretprobe
echo 'r:myretprobe do_sys_open $retval' >> /sys/kernel/debug/tracing/kprobe_events
# Cleanup
echo 0 > /sys/kernel/debug/tracing/events/kprobes/myprobe/enable
echo '-:myprobe' > /sys/kernel/debug/tracing/kprobe_events
内核内 kprobe(模块):
#include <linux/kprobes.h>
static struct kprobe kp = {
.symbol_name = "do_sys_open",
.pre_handler = my_pre_handler,
};
static int __init mod_init(void)
{
return register_kprobe(&kp);
}
6. 动态调试(dyndbg)
# Enable all debug messages for a module
echo 'module mydriver +p' > /sys/kernel/debug/dynamic_debug/control
# Enable specific file:line
echo 'file drivers/i2c/i2c-core.c +p' > /sys/kernel/debug/dynamic_debug/control
# Query current settings
grep mydriver /sys/kernel/debug/dynamic_debug/control
启动时:在内核命令行中添加 dyndbg="module mydriver +p"。
7. kdump 和崩溃分析
# Setup kdump (crash kernel reserved memory)
# /etc/default/grub: crashkernel=256M
sudo kdump-config show
# After crash, vmcore in /var/crash/
ls /var/crash/*/vmcore
# Analyze with crash utility
crash /usr/lib/debug/boot/vmlinux-$(uname -r) /var/crash/*/vmcore
crash> bt
crash> log
crash> ps
crash> kmem -i
crash> mod
# Compress vmcore
makedumpfile -c -d /proc/vmcore /tmp/vmcore.lzo
8. 通过 /proc/sys 在运行时调整调试参数
# Panic on oops (reproduce in VM)
sysctl kernel.panic_on_oops=1
# Soft lockup detection
sysctl kernel.softlockup_panic=1
# Watchdog
sysctl kernel.nmi_watchdog=1
# Slab debugging
# Boot: slub_debug=P,pagealloc
9. 调试决策树
Kernel issue type?
├── Panic/oops → dmesg; crash vmcore; CONFIG_DEBUG_INFO_BTF
├── Logic bug in driver → dyndbg; ftrace function_graph
├── Performance regression → perf record -g -a; trace-cmd
├── Intermittent → kprobes on suspect path
└── Module crash → kgdb; try_module_get audit
常见问题
| 症状 | 原因 | 修复方法 |
|---|---|---|
| kgdb 无法连接 | tty 或波特率错误 | 使 kgdboc 与串口适配器匹配 |
| ftrace 跟踪记录为空 | tracing_off 或 nop 跟踪器 | 执行 echo function > current_tracer;启用 tracing_on |
| kprobe 注册失败 | 缺少 CONFIG_KPROBES 或函数已内联 | 使用 tracepoint 或 static_key |
| dyndbg 没有效果 | 未启用 CONFIG_DYNAMIC_DEBUG | 使用该选项重新构建内核 |
| crash 无法读取 vmcore | vmlinux 调试符号错误 | 安装 linux-image-$(uname -r)-dbg |
| SysRq 无效 | 已禁用 kernel.sysrq | 执行 echo 1 > /proc/sys/kernel/sysrq |
相关技能
skills/low-level-programming/linux-kernel-modules— 正在调试的模块开发skills/kernel/device-drivers— 驱动专属的 probe/IRQ 问题skills/kernel/kernel-internals— 用于解读跟踪记录的子系统知识skills/debuggers/gdb— 与 kgdb 共用的 GDB 命令skills/profilers/linux-perf— 使用 perf 查找内核热点skills/observability/ebpf— 非侵入式内核跟踪替代方案
评论
支持 Markdown