Gdb:目标远程连接错误的地方?

Gdb: target remote connects at the wrong place?

我正在根据 Rust Embedded Book.

学习如何使用 OpenOCD 和 GDB

连接到 运行 OpenOCD 的那一刻:

(gdb) target remote :3333
Remote debugging using :3333
0x00000000 in ?? ()

有些东西坏了,我知道没有任何改变,现在我看到这样的东西:

(gdb) target remote :3333
Remote debugging using :3333
0x08000bbe in __c_m_sh_syscall ()

此后将无法正常工作。 0x00000000 in ?? () 行是什么意思,如何恢复正常?

当您使用 target remote 连接到目标时,GDB 会向目标询问其当前寄存器状态,包括 $pc 值。 GDB 不会(在那个时候)以任何方式修改远程状态。

当您第一次连接遥控器时,报告的 $pc 值为 0x0。如果遥控器由于某种原因改变了状态,比方说,你 运行 遥控器上的东西,那么 $pc 值可能会改变,比如 0x08000bbe.

如果您随后断开连接并重新连接,远程目标可能仍然具有 0x08000bbe$pc 值,这是 GDB 将看到的值。

如评论中所述,GDB 只是试图将 $pc 值映射到程序中的调试信息。 ?? 表明 GDB 在地址 0x0 找不到任何符号。虽然 GDB 确实在地址 0x08000bbe 附近找到了符号 __c_m_sh_syscall。然而,这些信息在这一点上没有多大意义,您还没有将任何东西加载到目标上,所以您在函数 __c_m_sh_syscall 中并不是 真的,它只是遥控器的当前地址。

当您执行 load 命令时,这是 GDB 将可执行文件加载到目标并写入 $pc.

的时候

TL;DR;如果您的工作流程是 target remote 然后 load,请不要担心 target remote 之后目标的状态,这就是 运行dom 状态恰好是什么连接时在目标中。