kernel-debugging について
カーネルクラッシュ、ドライバー、モジュール、性能問題に取り組むエージェント向けのLinuxカーネルデバッグガイドです。ライブデバッグ、トレース、動的ログ、クラッシュダンプ分析を扱います。
主な機能
- 01kgdbとkdbによるデバッグ
- 02ftraceとkprobesによる追跡
- 03dyndbgによる動的ログ制御
- 04kdumpダンプの分析
- 05/proc/sysのデバッグ設定調整
活用シーン
- 01カーネルのpanicやoopsの分析
- 02kgdbでドライバーやモジュールをデバッグ
- 03関数呼び出しや性能問題の追跡
- 04ドライバーのデバッグログ有効化
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill kernel-debuggingインストール後、Claude Code で/kernel-debuggingを入力して読み込まれたか確認します。
詳細
カーネルデバッグ
目的
シリアルまたは USB 経由の kgdb、kdb 組み込みデバッガーコマンド、ftrace と trace-cmd、kprobes と kretprobes、動的デバッグ(dyndbg)、crash と makedumpfile を使ったクラッシュダンプ解析、dmesg のログレベル、デバッグ用の /proc/sys ランタイム調整を通じて、Linux カーネルのデバッグをエージェントに案内します。
使用する状況
- スタックトレースが不明瞭なカーネルパニックまたは 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 の場合:対応ハードウェアでは kgdboc=usb と CONFIG_KGDB_KDB を使用します。
3. kdb コマンド
CONFIG_KGDB_KDB を有効にすると、kdb はカーネル内シェルを提供します。
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— ドライバー固有のプローブ/IRQ の問題skills/kernel/kernel-internals— トレースの解釈に必要なサブシステムの知識skills/debuggers/gdb— kgdb と共通する GDB コマンドskills/profilers/linux-perf— カーネルのホットスポットに対する perfskills/observability/ebpf— 非侵襲的なカーネルトレースの代替手段
コメント
Markdown 対応