调试正在加载的内核模块

时间:2016-05-05 20:05:34

标签: linux debugging linux-kernel kernel-module

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

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

然后我可以运行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并达到断点,但我认为我完全走错了路。

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

1 个答案:

答案 0 :(得分:1)

您要链接的文档指出在调试时不能使用断点。否则你可能会意外地死掉内核(例如,如果断点上的线程阻塞有调试器需要检查线程的自旋锁?),那么内核需要继续运行也没有稳定状态。

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

方法是使用类似qemu的东西并从主机附加到vm。 http://wiki.osdev.org/Kernel_Debugging

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