连接到mips模拟器时,如何让gdb识别eret指令?

时间:2018-07-09 04:18:10

标签: gdb gdbserver

我打印了gdb和qemu-i386之间交换的数据包,我看到当我在gdb中键入si且当前pc指向iret指令时,gdb会将vCont;s:1发送到qemu-i386-server,但是如果当前pc指向普通指令,则gdb将向{emu}发送Z0;addr:4vCont;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命令将仅执行一条指令。预先感谢!

1 个答案:

答案 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指令。无论如何,这似乎是个好主意。