gpt4 book ai didi

debugging - 通过KGDB进行模块调试

转载 作者:行者123 更新时间:2023-12-02 23:52:05 26 4
gpt4 key购买 nike

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

Cannot access memory at address 0x802010a0

下面是我正在使用的Makefile:

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

请告诉我可能存在什么问题。

最佳答案

可加载内核模块在内存中的位置仅在插入模块时设置。当您在模块函数上设置断点时,gdb 会查阅模块文件 (.ko) 来获取地址,这是错误的。您需要告知 gdb 该模块的实际位置。

您可以咨询this book (第 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/${MODULE_NAME}/sections/"
    echo add-symbol-file $MODULE_FILE $(cat "$DIR/.text") -s .bss $(cat "$DIR/.bss") -s .data $(cat "$DIR/.data")
    您应该得到类似于以下内容的输出:
    add-symbol-file /lib/modules/.../your_module_name.ko 0xffffffffa0110000 -s .bss 0xffffffffa011b948 -s .data 0xffffffffa011b6a0
  3. 在机器 2 上运行 gdb vmlinux
  4. 在机器 2 上的 gdb 控制台上,运行阶段 2 中最终命令的输出。
  5. 在 machine2 上的 gdb 控制台上,通过运行 target remote/dev/ttyS0 连接到 machine1(假设您的串行端口位于 ttyS0)
  6. 在 machine1 上,运行 echo g >/proc/sysrq-trigger。机器会死机
  7. 在 machine2 上的 gdb 控制台上,根据需要设置断点。
  8. 继续调试。应在需要时触发断点。
可能还有其他问题阻止您设置断点,但这是要跨越的主要障碍。

关于debugging - 通过KGDB进行模块调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6260927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com