调试 Linux 驱动(kernel modules / drivers)通常包括日志输出、内核调试工具、断点调试、以及硬件相关手段。下面按“由浅入深”的方式给你一个实用指南。
printk驱动中最常用的调试方式。
printk(KERN_DEBUG "my_driver: value = %d\n", val);
级别:
KERN_ERRKERN_WARNINGKERN_INFOKERN_DEBUG查看日志:
dmesg
dmesg -w # 实时
journalctl -k # systemd 系统
# 打开某个文件的 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");
insmod mydrv.ko
rmmod mydrv
lsmod
modinfo mydrv.ko
ls /dev
cat /proc/devices
ls /sys/class
/proc 和 /sysstatic struct proc_dir_entry *proc_entry;
proc_entry = proc_create("mydebug", 0, NULL, &fops);
static DEVICE_ATTR_DEBUG;
用于:
驱动崩溃常见。
dmesg
你会看到:
BUG: unable to handle page faultCall Traceaddr2lineaddr2line -e mydrv.ko 0x1234
gdbgdb mydrv.ko
(gdb) list *0x1234
CONFIG_DEBUG_INFO=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
kgdboc=ttyS0,115200 kgdbwait
gdb vmlinux
(gdb) target remote /dev/ttyS0
⚠️ 需要两台机器或虚拟机。
qemu-system-x86_64 -kernel bzImage -append "console=ttyS0" -nographic -s -S
另一个终端:
gdb vmlinux
(gdb) target remote :1234
适合:
ioremap()
readl() / writel()
cat /proc/iomem
lspci -vv
用于:
| 工具 | 用途 |
|---|---|
dmesg |
内核日志 |
printk |
基础调试 |
ftrace |
函数调用跟踪 |
perf |
性能分析 |
kgdb |
源码级调试 |
QEMU |
虚拟环境 |
kprobe |
运行时 Hook |
如果你愿意,可以告诉我:
我可以直接给你针对性的调试步骤和示例代码。