我正在尝试使用jtag probe和gdb远程调试在arm cortex-a9目标上运行的linux内核。 我可以连接到内核并使用gdb暂停它。我能够在内核代码中设置断点,gdb也确认了放置位置,但问题是一旦我开始执行并发出continue命令,断点就永远不会被命中,内核继续运行....
请在这方面帮助我。 感谢。
答案 0 :(得分:1)
如指出in this thread,您应该将断点设置为硬件断点,即 - 使用hbreak
命令。只有这样才能击中断点。
答案 1 :(得分:0)
对于任何阅读本文的人,默认情况下调试器都不会中断软件断点,请参见相关文档:
”如果所使用的体系结构支持内核选项CONFIG_STRICT_KERNEL_RWX,则应考虑将其关闭。此选项将阻止使用软件断点,因为它将内核内存空间的某些区域标记为只读。支持所使用的体系结构,如果希望在CONFIG_STRICT_KERNEL_RWX选项打开的情况下运行,则可以使用硬件断点,否则需要关闭此选项。“
在https://www.kernel.org/doc/html/v4.14/dev-tools/kgdb.html
禁用RWX并重新编译,然后软件断点应该可以工作(此后它们在这里开始正常工作)
答案 2 :(得分:0)
在某些情况下,KASLR(内核地址空间布局随机化)可能是罪魁祸首。 即使您设置了 hbreak,实际代码位置也可能与使用 KASLR 时从 .elf 文件中看到的地址不同,因此要么将 --append "nokaslr" 传递给内核引导参数,要么使用 RANDOMIZE_BASE=n 配置内核。这适用于 arm64 和 x86_64。 (也可能是其他架构)。