10

如何为可加载的 linux 内核模块构建调试信息(如 vmlinux- uname -r.debug 中的内核?)它是否在我们构建模块时生成,如果是,它将位于何处?

4

2 回答 2

8

假设您已经使用 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 Foundation 网站上有一个教程可以引导您完成此操作。使用 GDB 进行内核和模块调试

于 2012-11-29T14:18:40.160 回答
8
#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 
于 2016-10-05T15:58:34.937 回答