调试正在加载的内核模块



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

注意我目前正在 Linux 2.0.18 上尝试此操作。我遵循了这个很棒的教程。由于内核配置选项CONFIG_PROC_KCORECONFIG_DEBUG_INFO似乎在此内核版本中不可用,因此我在 Makefile 中添加了-g -gdwarf CFLAGS,重新编译了内核和模块并重新启动。

然后我可以运行gdb vmlinux /proc/kcore然后p jiffies这给了我$1 = 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 之类的东西并从主机附加到 vm。 http://wiki.osdev.org/Kernel_Debugging

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

最新更新