为了项目的需要,我写了一个简单的java套接字程序来实现一个“假的”gdbserver存根。因此,支持最小数量的gdb RSP命令:g,G,m,M,c和s。对于其他命令,只需使用“$#00”进行响应。根据gdb的手册,这将告诉gdb“服务器”不支持其他命令。
我使用Eclipse CDT来帮助我调试。在调试配置中,我选择了c / c ++远程应用程序,并在localhost:10000上使用TCP设置调试器连接,我的java程序将使用它来监听。
首先,gdb发送命令,如qSupported,Hg0,qTStatus,?和qC。对所有这些响应都是“$#00”告诉gdb“服务器”不支持这些命令。然后,gdb发送qAttached和qOffsets。发送两个“$#00”响应并从gdb收到“+”后,gdb说“警告:无效的远程回复:”。
有人可以告诉我为什么会这样吗?为什么gdb不发送命令并说“无效远程回复:”,我不知道回复是无效的,毕竟我只是将“$#00”和“+”发送给gdb。
答案 0 :(得分:2)
当我阅读GDB手册时,这也让我很困惑。我怀疑你需要实现的命令集(即那些应该影响模拟器状态的命令)是服务器需要能够回复的命令的一部分。
这个excellent guide to writing an RSP server by Embecosm在3.1节中有一个非常方便的序列图,它描述了GDB和你的RSP服务器之间的初始握手:
一旦握手工作,就可以更容易地看到协议如何组合在一起并开始在与模拟器(或其他目标)交互的代码中编写。