插件窝 干货文章 使用GDB调试Linux内核的常用配置技巧

使用GDB调试Linux内核的常用配置技巧

内核 GDB 调试 使用 65    来源:    2025-04-16

GDB调试Linux内核的常用配置技巧

基本配置

1. 编译内核时启用调试符号

make menuconfig
# 确保以下选项开启:
# Kernel hacking -> Compile-time checks and compiler options -> 
#   [*] Compile the kernel with debug info
#   [*] Provide GDB scripts for kernel debugging

2. 获取vmlinux文件

编译内核后会生成包含完整符号信息的vmlinux文件(位于内核源码根目录),这是GDB调试的关键文件。

QEMU+GDB调试配置

1. 启动QEMU并等待GDB连接

qemu-system-x86_64 -kernel arch/x86/boot/bzImage \
                   -append "console=ttyS0 nokaslr" \
                   -hda rootfs.img \
                   -nographic \
                   -s -S  # -s: 在1234端口监听GDB; -S: 启动时暂停CPU

3. GDB连接配置

gdb vmlinux
(gdb) target remote :1234
(gdb) break start_kernel  # 设置初始断点
(gdb) continue

实用GDB命令

1. 常用调试命令

# 断点管理
break function_name
break *address
watch variable
delete breakpoint_num

# 执行控制
continue (c)
next (n)
step (s)
finish

# 信息查看
info registers
info breakpoints
backtrace (bt)

2. 内核特有命令

lx-symbols  # 自动加载内核模块符号
lx-lsmod    # 列出已加载模块
lx-dmesg    # 查看内核日志
p task_struct->comm  # 查看当前进程名

高级配置技巧

1. 使用.gdbinit自动配置

~/.gdbinit或当前目录下的.gdbinit中添加:

add-auto-load-safe-path /path/to/kernel/source
set print pretty on
set disassembly-flavor intel

2. 调试内核模块

add-symbol-file /path/to/module.ko 0xffffffffc0000000  # 模块加载地址可从/sys/module/module_name/sections/.text获取
lx-symbols  # 自动加载所有模块符号

3. 调试Oops信息

当内核崩溃时,可以使用GDB分析Oops信息:

list *address  # 查看崩溃位置的代码
bt             # 查看调用栈

4. 使用Python脚本增强功能

GDB支持Python脚本扩展,内核源码中的scripts/gdb目录包含许多实用脚本:

source scripts/gdb/vmlinux-gdb.py

常见问题解决

  1. 符号加载失败

    • 确保使用与运行内核完全匹配的vmlinux文件
    • 检查内核编译时是否启用了调试符号
  2. 断点不生效

    • 尝试禁用KASLR(内核命令行添加nokaslr
    • 使用硬件断点:hbreak代替break
  3. 单步执行异常

    • 可能遇到中断处理,使用nexti/stepi指令级单步
    • 考虑使用ignore N 100暂时跳过频繁触发的断点
  4. 远程连接问题

    • 检查QEMU是否使用了-s选项
    • 确认防火墙没有阻止1234端口

通过以上配置和技巧,可以高效地使用GDB调试Linux内核,分析内核行为或排查问题。