首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过KGDB进行模块调试

通过KGDB进行模块调试
EN

Stack Overflow用户
提问于 2011-06-07 05:25:13
回答 1查看 6.2K关注 0票数 5

我想调试我的内核模块。为此,我试图在调用我的do_one_initcall之前在kernel/module.c中的init_module中放置一个断点,但它正在显示

无法访问地址0x802010a0的内存

下面是我使用的Makefile

代码语言:javascript
复制
obj-m := hello.o

KDIR=/lib/modules/$(shell uname -r)/build
PWD=$(shell pwd)

EXTRA_CFLAGS += -g

all:
        make -C $(KDIR) M=$(PWD) modules

clean:
        make -C $(KDIR) M=$(PWD) clean

请给我建议一下有什么问题。

EN

回答 1

Stack Overflow用户

发布于 2011-07-07 08:50:12

只有在插入模块时才会设置可加载内核模块在内存中的位置。当您在模块函数上设置断点时,gdb将查询模块文件(.ko)中的地址,这是错误的。您需要将模块的实际位置通知gdb。

您可以查阅这本书 (第4章,调试程序和相关工具部分)以获得更多信息,但下面是我为此设计的一个简短过程。

  • machine1是调试过的机器。
  • machine2是运行调试器的机器。

  1. 在machine1上运行modpbrobe your_module_name
  2. 在machine1上,运行以下shell命令: MODULE_NAME=your_module_name MODULE_FILE=$(modinfo $MODULE_NAME| awk '/filename/{print $2}') DIR=“/sys/模块/${MODULE_NAME}/sys/”echo Add-符号-file $MODULE_FILE $(cat“$DIR/..text”) -s .bss $(cat“$DIR/..bss”) -s .data $(cat“$DIR/..data”) 您应该得到一个类似于以下输出的输出:add-符号-file/lib/module/./ you _you_name.ko 0xffffffa 0110000 -s .bss 0xffffafa011b948 -s .data 0xffffffa011b6a0
  3. 在machine2上运行gdb vmlinux
  4. 在machine2上,在gdb控制台上,在第2阶段运行最终命令的输出。
  5. 在machine2上,在gdb控制台上,通过运行target remote /dev/ttyS0连接到machine1 (假设您的串口位于ttyS0)
  6. 在machine1上运行echo g > /proc/sysrq-trigger。机器会结冰
  7. 在machine2上,在gdb控制台上,根据需要设置断点。
  8. 继续调试。断点应在需要时触发。

可能还有其他问题阻止您设置断点,但这是要跨越的主要障碍。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6260927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档