mcpField
K
kernel-debugging

kernel-debugging

github.com/mohitmishra786開発269314 回インストール18 週間前に更新
リポジトリ

kernel-debugging について

カーネルクラッシュ、ドライバー、モジュール、性能問題に取り組むエージェント向けのLinuxカーネルデバッグガイドです。ライブデバッグ、トレース、動的ログ、クラッシュダンプ分析を扱います。

主な機能

  1. 01kgdbとkdbによるデバッグ
  2. 02ftraceとkprobesによる追跡
  3. 03dyndbgによる動的ログ制御
  4. 04kdumpダンプの分析
  5. 05/proc/sysのデバッグ設定調整

活用シーン

  1. 01カーネルのpanicやoopsの分析
  2. 02kgdbでドライバーやモジュールをデバッグ
  3. 03関数呼び出しや性能問題の追跡
  4. 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 — カーネルのホットスポットに対する perf
  • skills/observability/ebpf — 非侵襲的なカーネルトレースの代替手段

コメント