我正在学习如何使用OpenOCD和GDB根据Rust嵌入式书。
当您连接到正在运行的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
。
如果您断开连接并重新连接,远程目标可能仍然有$pc
值为0x08000bbe
,这是GDB将看到的。
正如在注释中提到的,GDB只是试图将$pc
值映射到程序中的调试信息。??
显示GDB在地址0x0
上找不到任何符号。而GDB确实在地址0x08000bbe
附近找到了符号__c_m_sh_syscall
。然而,在这一点上,这些信息并没有多大意义,您还没有将任何东西加载到目标上,所以在函数__c_m_sh_syscall
中您并不是真正的,它只是远程的当前地址。
当您执行load
命令时,这是GDB将可执行文件加载到目标上,并写入$pc
的时候。
TL,博士;如果你的工作流程是target remote
,然后是load
,不要担心target remote
之后的目标状态,这只是当你连接时目标中碰巧出现的随机状态。