c – gdb远程调试.实现一个假的gdbserver存根.经过多次请求和响应,得到一个警告:无效的远程回复

为了项目的需要,我写了一个简单的
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.

最佳答案 当我阅读GDB手册时,这也让我感到困惑.我怀疑您需要实现的命令集(即那些应该影响模拟器状态的命令)是服务器需要能够回复的命令的子集.

这个excellent guide to writing an RSP server by Embecosm在3.1节中有一个非常方便的序列图,它描述了GDB和你的RSP服务器之间的初始握手:

《c – gdb远程调试.实现一个假的gdbserver存根.经过多次请求和响应,得到一个警告:无效的远程回复》

一旦握手工作,就可以更容易地看到协议如何组合在一起并开始在与模拟器(或其他目标)交互的代码中编写.

点赞