在 Linux 下调试驱动(kernel module / 设备驱动)常见手段和思路如下,按“从简单到深入”整理,你可以根据场景选用。
printk驱动里最常用:
printk(KERN_INFO "drv: value = %d\n", val);
级别:
KERN_ERRKERN_WARNINGKERN_INFOKERN_DEBUG查看日志:
dmesg
dmesg | tail
实时查看:
sudo dmesg -w
或
sudo tail -f /var/log/kern.log
⚠️ 注意:频繁 printk 会影响性能,甚至死锁。
适合不想改代码重新编译的场景。
mount -t debugfs none /sys/kernel/debug
echo "file mydriver.c +p" > /sys/kernel/debug/dynamic_debug/control
dmesg
常见选项:
+p 打印-p 关闭+f 显示函数名+l 显示行号在驱动中创建调试节点:
static int my_proc_show(struct seq_file *m, void *v)
{
seq_printf(m, "debug info\n");
return 0;
}
static ssize_t debug_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
return sprintf(buf, "debug\n");
}
用户态:
cat /sys/class/mydev/debug
echo 1 > /sys/class/mydev/debug
✅ 非常适合参数调试、状态查看。
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
kgdboc=ttyS0,115200 kgdbwait
gdb vmlinux
target remote /dev/ttyS0
✅ 可断点、单步、看变量
❌ 配置复杂,多用于开发板/虚拟机
如果是学习或调试新驱动:
qemu-system-x86_64 -kernel bzImage -append "console=ttyS0" -nographic -s -S
另一个终端:
gdb vmlinux
target remote :1234
✅ 安全、可重复、不影响真实系统
cd /sys/kernel/debug/tracing
echo function > current_tracer
echo my_driver_func > set_ftrace_filter
echo 1 > tracing_on
# 操作驱动
cat trace
✅ 不用改代码
✅ 非常适合分析调用流程
dmesg
关键信息:
addr2lineaddr2line -e vmlinux 0xffffffff81234567
crash vmlinux vmcore
lsmod | grep mydrv
ls /dev/
ls /sys/class/
sudo insmod mydrv.ko
printk 太多msleep)在原子上下文| 场景 | 推荐方式 |
|---|---|
| 快速定位 | printk + dmesg |
| 不想重编 | dynamic debug |
| 学习驱动 | QEMU + GDB |
| 分析流程 | ftrace |
| 内核崩溃 | Oops + addr2line |
如果你愿意,可以告诉我:
我可以直接给你针对性的调试步骤和示例。