【问题标题】:Breakpoints not being hit in remote linux kernel debugging using gdb使用 gdb 在远程 linux 内核调试中未命中断点
【发布时间】:2015-03-25 19:00:49
【问题描述】:

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

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

【问题讨论】:

  • 我在编译内核时关闭了所有优化,并从 menuconfig 内核黑客选项中启用了“使用调试信息构建”选项....

标签: linux-kernel gdb remote-debugging jtag


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-05-08
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        • 2013-06-22
        相关资源
        最近更新 更多