在PowerPC上实现断点读/写

时间:2017-03-29 11:24:55

标签: c assembly powerpc

breakpoint read/write如何实施?请注意,这与breakpoint execute不同。

我们的想法是从数据存储器地址开始,然后找到从/向该地址读/写的汇编指令。从理论上讲,我们必须检查寄存器和正在执行的下一条指令(考虑位移偏移),以确定是否为真。让我们说当前指令是"存储字":stw r0, 4 (r31)所以它写入地址r31 + 4。我们可以通过读取r31中的值,添加4并检查它是否等于初始数据地址来查明是否中断。

然而,这似乎是不可行的,因为使用C编程你不能监视我相信的汇编中的每个指令执行。这是如何一般地或特定于PowerPC完成的?是否有任何特殊的汇编指令或调试寄存器可以简化这一过程?

2 个答案:

答案 0 :(得分:7)

在PowerPC中,与具有此类功能的所有其他CPU一样,这是通过硬件支持完成的。有一个特殊的寄存器“数据地址断点”(DABR),您可以在其中设置应检查的存储器地址以及是否应该读取和/或写入访问等。

当某些指令执行对该给定地址的读或写操作时,CPU将触发中断(数据存储中断)。从ISR中,您只需要检查返回地址以查看您是如何在那里结束的,然后您获得了导致中断的指令的程序地址。

有关详细信息,请查看PowerISA手册。 (他们的网站http://www.power.org/似乎已经下降了)

答案 1 :(得分:1)

分页是否已开启?如果是,您可以将变量标记为不可写的页面,捕获产生的保护错误,检查它是否写入变量并停止执行(如果是)。但是,当页面包含其他常用变量时,这可能会有点慢。