插件窝 干货文章 Linux内核调试方法

Linux内核调试方法

内核 调试 DEBUG kernel 862    来源:    2025-05-14

Linux内核调试是系统开发和故障排查中的重要技能。以下是全面的调试方法分类和操作指南:


一、基础调试工具

  1. printk(内核日志)

    printk(KERN_DEBUG "Debug message: val=%d\n", var); 
    
    • 优先级:KERN_EMERG (0) 到 KERN_DEBUG (7)
    • 查看日志: bash dmesg -T | tail -20 # 带时间戳显示最近20条 cat /proc/sys/kernel/printk # 查看当前日志级别 echo 8 > /proc/sys/kernel/printk # 启用所有级别输出
  2. 动态调试(Dynamic Debug)

    echo 'file *.c +p' > /sys/kernel/debug/dynamic_debug/control
    # 启用某文件所有printk
    

二、高级调试技术

1. KGDB/KDB(内核调试器)

  • 配置内核: CONFIG_KGDB=y CONFIG_KGDB_SERIAL_CONSOLE=y
  • 目标机启动参数添加: bash kgdboc=ttyS0,115200 kgdbwait
  • 主机GDB连接: bash gdb vmlinux (gdb) target remote /dev/ttyS0

2. QEMU + GDB

bash qemu-system-x86_64 -kernel bzImage -append "nokaslr root=/dev/sda" -S -s # 主机另一终端 gdb vmlinux (gdb) target remote :1234 (gdb) b start_kernel

3. SystemTap

bash stap -e 'probe kernel.function("sys_open") { log("open: " . filename) }'

4. perf工具

bash perf probe --add tcp_sendmsg # 添加探针 perf stat -e cache-misses ls # 统计事件 perf record -g -p <PID> # 采样调用栈


三、崩溃分析

  1. kdump/crash

    • 配置kdump: bash kexec -p /boot/vmlinuz --initrd=/boot/initrd.img --append="crashkernel=256M"
    • 分析转储文件: bash crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux vmcore
  2. Oops消息分析

    • 关键信息:
      • RIP(指令指针)
      • Call Trace(调用栈)
      • 崩溃模块(通常显示[]内)

四、内核跟踪

  1. ftrace

    echo function > /sys/kernel/debug/tracing/current_tracer
    echo __do_page_fault > /sys/kernel/debug/tracing/set_ftrace_filter
    cat /sys/kernel/debug/tracing/trace_pipe
    
  2. BPF (eBPF)

    bpftrace -e 'kprobe:do_sys_open { printf("%s: %s\n", comm, str(arg1)) }'
    

五、内存调试

  1. KASAN(内存错误检测)

    • 内核配置: CONFIG_KASAN=y CONFIG_KASAN_INLINE=y
    • 典型输出: BUG: KASAN: slab-out-of-bounds in kmalloc_oob_right+0x3c/0x50
  2. slub_debug

    echo 1 > /sys/kernel/slab/<slab_cache>/trace
    

六、注意事项

  1. 生产环境谨慎使用

    • 避免KGDBKDB在生产环境使用(可能导致系统冻结)
    • printk过量可能引发日志风暴
  2. 内核版本适配

    • 确保调试工具版本与内核匹配(特别是BPF/SystemTap)
  3. 符号信息

    • 调试时需保留内核符号文件(vmlinux)或编译CONFIG_DEBUG_INFO=y

七、推荐组合方案

场景 推荐工具
快速日志调试 printk + dynamic_debug
崩溃分析 kdump + crash
动态跟踪 ftrace + BPF
开发环境单步调试 QEMU+GDB
内存错误检测 KASAN + slub_debug

掌握这些工具后,90%以上的内核问题都能有效定位。实际使用时建议从非侵入式工具(如printk/ftrace)开始,逐步过渡到复杂调试方案。