温馨提示×

怎样调试linux drivers

小樊
45
2026-09-06 17:30:04
栏目: 智能运维

调试 Linux 驱动(kernel modules / drivers)通常包括日志输出、内核调试工具、断点调试、以及硬件相关手段。下面按“由浅入深”的方式给你一个实用指南。


一、最基础:打印日志(首选)

1. printk

驱动中最常用的调试方式。

printk(KERN_DEBUG "my_driver: value = %d\n", val);

级别:

  • KERN_ERR
  • KERN_WARNING
  • KERN_INFO
  • KERN_DEBUG

查看日志:

dmesg
dmesg -w        # 实时
journalctl -k   # systemd 系统

2. 动态调试(推荐)

# 打开某个文件的 debug
echo -n 'file my_driver.c +p' > /sys/kernel/debug/dynamic_debug/control

# 查看
cat /sys/kernel/debug/dynamic_debug/control

代码中:

pr_debug("debug info\n");

二、模块加载与基础检查

1. 加载/卸载

insmod mydrv.ko
rmmod mydrv
lsmod
modinfo mydrv.ko

2. 查看设备与节点

ls /dev
cat /proc/devices
ls /sys/class

三、使用 /proc/sys

1. 自定义 proc 接口

static struct proc_dir_entry *proc_entry;

proc_entry = proc_create("mydebug", 0, NULL, &fops);

2. sysfs 属性

static DEVICE_ATTR_DEBUG;

用于:

  • 读写寄存器
  • 触发测试函数
  • 查看状态

四、Oops / Panic 分析(非常重要)

驱动崩溃常见。

1. 触发后查看

dmesg

你会看到:

  • BUG: unable to handle page fault
  • Call Trace

2. 使用 addr2line

addr2line -e mydrv.ko 0x1234

3. 使用 gdb

gdb mydrv.ko
(gdb) list *0x1234

五、使用 GDB + KGDB(源码级调试)

1. 编译内核

CONFIG_DEBUG_INFO=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y

2. 启动参数

kgdboc=ttyS0,115200 kgdbwait

3. 主机 GDB

gdb vmlinux
(gdb) target remote /dev/ttyS0

⚠️ 需要两台机器或虚拟机。


六、QEMU + GDB(最推荐学习方案)

qemu-system-x86_64 -kernel bzImage -append "console=ttyS0" -nographic -s -S

另一个终端:

gdb vmlinux
(gdb) target remote :1234

适合:

  • 字符设备
  • 块设备
  • 网络驱动

七、硬件相关调试

1. 寄存器调试

ioremap()
readl() / writel()
cat /proc/iomem
lspci -vv

2. 逻辑分析仪 / 示波器

用于:

  • I2C / SPI
  • GPIO 时序

八、常用工具汇总

工具 用途
dmesg 内核日志
printk 基础调试
ftrace 函数调用跟踪
perf 性能分析
kgdb 源码级调试
QEMU 虚拟环境
kprobe 运行时 Hook

九、调试建议(经验)

  1. 先 printk,再上 GDB
  2. 驱动要能 rmmod 不崩
  3. Oops 必查 Call Trace
  4. QEMU 是最好的练手环境
  5. 不要害怕 kernel panic

如果你愿意,可以告诉我:

  • 你调试的是哪类驱动(字符 / 块 / 网络 / USB / I2C)
  • 是在物理机、虚拟机还是 QEMU
  • 当前遇到的具体问题

我可以直接给你针对性的调试步骤和示例代码

0