调试正在加载的内核模块

Debug a kernel module being loaded

我想知道是否可以调试正在加载的内核模块。

请注意,我目前正在 Linux 2.0.18 上尝试此操作。我已经关注了这个伟大的 tutorial。由于内核配置选项 CONFIG_PROC_KCORECONFIG_DEBUG_INFO 在这个内核版本中似乎不可用,我在 Makefile 中添加 -g -gdwarfCFLAGS,重新编译内核和模块并重新启动。

然后我可以 运行 gdb vmlinux /proc/kcore 然后 p jiffies 这给了我 = 1470917.

这就是我开始迷路的地方,也是因为该内核版本似乎没有 /sys/module/gdb1/sections,因为它似乎需要调试加载的模块。

所以我只是尝试加载模块的符号 "ne":

(gdb) symbol-file modules/ne.o

用"y"确认后加载符号。然后我设置一个断点:

(gdb) break ne.c:148
Breakpoint 1 at 0xa: file ne.c, line 148.

现在我想做modprobe ne并到达断点,但我认为我完全走错了路。

有可能吗?即使它不在这么旧的内核上,我也很高兴知道如何调试在当前内核上加载的模块。

您正在链接的文档声明您在调试时不能使用断点。否则你可能会意外地死锁内核(例如,如果在断点上阻塞的线程有一个自旋锁,调试器需要用来检查线程怎么办?),也没有稳定的状态,因为内核需要保持 运行 .

我只能推测为什么要描述这种方法。我的猜测是几年前没有太多选择,当时很少有人拥有支持虚拟化的硬件或多台机器进行远程调试。

解决方法是使用 qemu 之类的东西并从主机连接到虚拟机。 http://wiki.osdev.org/Kernel_Debugging

此外,对于 post 实时调试,您可以使用 https://people.redhat.com/anderson/crash_whitepaper/