2012-09-25 238 views
6

如何建立加载内核模块的调试信息(像内核的vmlinux- uname -r的.debug?),同时我们建立了一个模块是否产生,如果是的话它会位于?调试,信息

回答

5

假设你已经建立了CONFIG_DEBUG_INFO内核调试符号应该已经在有问题的模块.ko文件。然而,由于模块可以动态加载到任何地址,您需要向gdb提供更多信息。

cd /sys/module/${MODNAME}/sections 
cat .text .data .bss 

告诉GDB有关模块时,您可以使用这个信息:

(gdb) add-symbol-file ${MODPATH} ${TEXT} -s .data ${DATA} -s .bss ${BSS} 

有引导您完成这个Linux基金会网站上的教程。 Kernel and Module Debugging with GDB

+0

我可以设置断点和观察点吗?在那篇教程中,他们提到我们不能做更高级的设置断点等。所有这些都可以在单个系统中完成吗?否则我需要电脑? –

+0

您不能在主机上在主机内核上设置断点。在VM中调试内核或将串行调试设置为另一台机器,以便在调试时停止/启动内核。 – stsquad

4
#Modify your Makefile like this then build it 
#cat /sys/module/mydriver/sections/.text -> find the address 
#Then run like add-symbol-file drivers/mydrivers/mydriver.o address from above #line 
obj-m += module_name.o 
MY_CFLAGS += -g -DDEBUG 
ccflags-y += ${MY_CFLAGS} 
CC += ${MY_CFLAGS} 


all: 
     make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

debug: 
     make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
     EXTRA_CFLAGS="$(MY_CFLAGS)" 
clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 
+0

按照这个链接,我们不需要在模块的make文件中添加-g标志。 https://www.linux.com/learn/kernel-newbie-corner-kernel-and-module-debugging-gdb –