我打印了gdb和qemu-i386之间交换的数据包,我看到当我在gdb中键入si
且当前pc指向iret
指令时,gdb会将vCont;s:1
发送到qemu-i386-server,但是如果当前pc指向普通指令,则gdb将向{emu}发送Z0;addr:4
和vCont;c:1
,以使qemu继续到断点。
我的问题是,当我在模拟器调试器中输入si
且当前pc指向指令eret
时,我实现了mips32模拟器以及gdb服务器(类似于iret中的iret i386),由于eret会将pc设置为epc,所以gdb发送一条Z0;addr:4
让我在eret指令后添加一个断点,然后发送给我vCont;c:1
让我继续。将永远无法到达,并且在gdb中键入的si
命令以无限制的continue结尾。我想让gdb仅向我发送vCont;s:1
,这样si命令将仅执行一条指令。预先感谢!
答案 0 :(得分:0)
我相信让gdb发送vCont;s
有两个要素。
首先,您的存根必须正确回复vCont
探测数据包。例如,gdbserver显示:
Sending packet: $vCont?#49...Packet received: vCont;c;C;t;s;S;r
在这里,gdb已查询vCont?
,并且远程服务器已将s
放入答复中。因此,在适当的情况下,gdb将发送vCont;s
。
但是,默认情况下,gdb使用其对目标指令集的了解来决定如何单步执行。即,它解码指令并确定设置“单步断点”的地址。 (我不知道为什么在gdb中以这种方式完成它。)
假设您的存根已经正确答复,那么有两种方法可以解决您的问题,两种方法都涉及修补gdb。
我注意到arm_linux_software_single_step
是这样做的:
if (target_can_do_single_step () == 1)
return {};
因此,一个想法是更改MIPS端口以同样执行此操作。我不知道这是否会被上游接受(它可能以某种方式负面影响其他MIPS存根)。
或者,更改mips_software_single_step
以正确解码eret
指令。无论如何,这似乎是个好主意。