mcpField
K
kernel-debugging

kernel-debugging

github.com/mohitmishra786开发269314 次安装18 周前更新
代码仓库

关于 kernel-debugging

面向处理内核崩溃、驱动、模块和性能问题的 Agent,提供 Linux 内核调试指南。整合现场调试、跟踪、动态日志和崩溃转储分析流程。

主要功能

  1. 01kgdb 与 kdb 调试
  2. 02使用 ftrace 和 kprobes 跟踪
  3. 03使用 dyndbg 控制动态日志
  4. 04分析 kdump 转储
  5. 05调整 /proc/sys 调试参数

适用场景

  1. 01分析内核 panic 与 oops
  2. 02通过 kgdb 调试驱动或模块
  3. 03追踪函数调用与性能问题
  4. 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 无法读取 vmcorevmlinux 调试符号错误安装 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