1

我正在尝试使用 jtag 探针和 gdb 远程调试在 arm cortex-a9 目标上运行的 linux 内核。我可以连接到内核并使用 gdb 停止它。我可以在内核代码中设置断点,并且 gdb 也确认了那里的位置,但问题是一旦我开始执行并发出 continue 命令,断点永远不会被命中并且内核继续运行......

请在这方面帮助我。谢谢。

4

3 回答 3

3

正如该线程中所指出的,您应该将断点设置为硬件断点,即 - 使用hbreak命令。只有这样断点才会被击中。

于 2015-02-21T23:03:53.723 回答
2

对于阅读本文的任何人,默认情况下调试器不会中断软件断点,请参阅相关文档:

“如果您使用的架构支持内核选项 CONFIG_STRICT_KERNEL_RWX,则应考虑将其关闭。此选项将阻止使用软件断点,因为它将内核内存空间的某些区域标记为只读。如果 kgdb 支持它您正在使用的架构,如果您希望在 CONFIG_STRICT_KERNEL_RWX 选项打开的情况下运行,您可以使用硬件断点,否则您需要关闭此选项。”

https://www.kernel.org/doc/html/v4.14/dev-tools/kgdb.html

禁用 RWX 并重新编译,然后软件断点应该可以工作(在此之后它们开始正常工作)

于 2020-05-27T19:50:56.517 回答
1

在某些情况下,KASLR(内核地址空间布局随机化)可能是罪魁祸首。即使您设置了 hbreak,实际代码位置也可能与使用 KASLR 时从 .elf 文件中看到的地址不同,因此要么将 --append "nokaslr" 传递给内核引导参数,要么使用 RANDOMIZE_BASE=n 配置内核。这适用于 arm64 和 x86_64。(也许还有其他架构)。

于 2021-02-23T04:50:31.110 回答