breakpoint read/write
如何实施?请注意,这与breakpoint execute
不同。
我们的想法是从数据存储器地址开始,然后找到从/向该地址读/写的汇编指令。从理论上讲,我们必须检查寄存器和正在执行的下一条指令(考虑位移偏移),以确定是否为真。让我们说当前指令是"存储字":stw r0, 4 (r31)
所以它写入地址r31 + 4
。我们可以通过读取r31
中的值,添加4
并检查它是否等于初始数据地址来查明是否中断。
然而,这似乎是不可行的,因为使用C编程你不能监视我相信的汇编中的每个指令执行。这是如何一般地或特定于PowerPC完成的?是否有任何特殊的汇编指令或调试寄存器可以简化这一过程?
答案 0 :(得分:7)
在PowerPC中,与具有此类功能的所有其他CPU一样,这是通过硬件支持完成的。有一个特殊的寄存器“数据地址断点”(DABR),您可以在其中设置应检查的存储器地址以及是否应该读取和/或写入访问等。
当某些指令执行对该给定地址的读或写操作时,CPU将触发中断(数据存储中断)。从ISR中,您只需要检查返回地址以查看您是如何在那里结束的,然后您获得了导致中断的指令的程序地址。
有关详细信息,请查看PowerISA手册。 (他们的网站http://www.power.org/似乎已经下降了)
答案 1 :(得分:1)
分页是否已开启?如果是,您可以将变量标记为不可写的页面,捕获产生的保护错误,检查它是否写入变量并停止执行(如果是)。但是,当页面包含其他常用变量时,这可能会有点慢。