我无法使用windbg设置4字节读/写访问硬件断点。
0:000> dd 02e80dcf
02e80dcf 13121110 17161514 1a191800 1e1d1c1b
02e80ddf 011c171f c7be7df1 00000066 4e454900
实际上我必须检查程序改变/覆盖值 0x13121110 (地址0x02e80dcf)的时间。
所以,当我试图设置4字节写访问硬件断点@ 0x02e80dcf 时,我得到数据断点必须对齐错误。
0:000> ba w 4 02e80dcf
Data breakpoint must be aligned
^ Syntax error in 'ba w 4 02e80dcf'
0:000> ba r 4 02e80dcf
Data breakpoint must be aligned
^ Syntax error in 'ba r 4 02e80dcf'
0:000> ba w 1 02e80dcf
breakpoint 0 redefined
我能够在地址处设置1字节写访问断点,但是当指针@地址0x02e80dcf被覆盖时,它不会被触发。
如果有人能提出任何其他方法来检测地址被覆盖的东西,那将非常有帮助。
注意:我面临的特定程序问题。我可以在同一个调试环境中设置4字节硬件断点。
答案 0 :(得分:6)
作为旁注,这种特殊行为来自CPU架构本身(而不是来自系统或调试器)。
x86和x86-64(Intel术语中的IA32和IA32-e)架构使用Drx(调试寄存器)来处理硬件断点。
Dr7 LENn字段将设置断点的长度,Dr0到Dr3将保存断点地址。
来自Intel Manual 3B - Chapter 18.2.5. "Breakpoint Field Recognition"
:
LENn字段允许指定1字节,2字节,4字节或8字节范围, 从相应调试中指定的线性地址开始 注册(DRn)。
在同一章中明确指出:
双字节范围必须在字边界上对齐;必须有4个字节的范围 在双字边界上对齐。
如果用一个足够长的数据断点覆盖所需的地址,那么它将陷阱(断点将被命中):
如果有任何数据断点,则会触发读取或写入数据的数据断点 参与访问的字节在a定义的范围内 断点地址寄存器及其LENn字段。
然后手册会给出一个提示,以便在未对齐的地址上进行陷阱,并给出一个示例表:
可以使用构造未对齐操作数的数据断点 两个断点,每个断点都是字节对齐的,两个断点 断点一起覆盖了操作数。
答案 1 :(得分:4)
地址必须在4字节边界上对齐(或者对于64位系统更大)。
任何以0xf结尾的十六进制地址都不会与4字节边界对齐。
WinDbg可能存在数据断点与4或8字节边界对齐的限制。您需要使用条件中断,以便只检查一个字节。