无法设置 4 字节硬件断点 Windbg
Cannot Set 4 Byte Hardware Breakpoint Windbg
我无法使用 windbg 设置 4 字节读/写访问硬件断点。
0:000> dd 02e80dcf
02e80dcf 13121110 17161514 1a191800 1e1d1c1b
02e80ddf 011c171f c7be7df1 00000066 4e454900
实际上我必须检查值 0x13121110(地址 0x02e80dcf)何时被程序获取 changed/overwritten。
所以当我尝试设置一个 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 字节硬件断点。
地址必须对齐到 4 字节边界(或更大的 64 位系统)。
任何以 0xf 结尾的十六进制地址都没有与 4 字节边界对齐。
WinDbg 可能限制数据断点对齐到 4 或 8 字节边界。许多人需要使用条件中断,以便只检查一个字节。
附带说明一下,此特定行为来自 CPU 体系结构本身(而不是来自系统或调试器)。
x86 和 x86-64(英特尔术语中的 IA32 和 IA32-e)架构使用 Drx(调试寄存器)来处理硬件断点。
Dr7 LENn 字段将设置断点的长度,Dr0 到 Dr3 将保存断点地址。
来自 Intel Manual 3B - Chapter 18.2.5. "Breakpoint Field Recognition"
:
The LENn fields permit specification of a 1-, 2-, 4-, or 8-byte range,
beginning at the linear address specified in the corresponding debug
register (DRn).
在同一章节中明确指出:
Two-byte ranges must be aligned on word boundaries; 4-byte ranges must
be aligned on doubleword boundaries.
如果你用足够长的数据断点覆盖所需的地址,那么它会陷入陷阱(断点会被击中):
A data breakpoint for reading or writing data is triggered if any of
the bytes participating in an access is within the range defined by a
breakpoint address register and its LENn field.
然后手册继续给出一个提示来捕获未对齐的地址并给出了一个例子table:
A data breakpoint for an unaligned operand can be constructed using
two breakpoints, where each breakpoint is byte-aligned and the two
breakpoints together cover the operand.
我无法使用 windbg 设置 4 字节读/写访问硬件断点。
0:000> dd 02e80dcf
02e80dcf 13121110 17161514 1a191800 1e1d1c1b
02e80ddf 011c171f c7be7df1 00000066 4e454900
实际上我必须检查值 0x13121110(地址 0x02e80dcf)何时被程序获取 changed/overwritten。
所以当我尝试设置一个 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 字节硬件断点。
地址必须对齐到 4 字节边界(或更大的 64 位系统)。
任何以 0xf 结尾的十六进制地址都没有与 4 字节边界对齐。
WinDbg 可能限制数据断点对齐到 4 或 8 字节边界。许多人需要使用条件中断,以便只检查一个字节。
附带说明一下,此特定行为来自 CPU 体系结构本身(而不是来自系统或调试器)。
x86 和 x86-64(英特尔术语中的 IA32 和 IA32-e)架构使用 Drx(调试寄存器)来处理硬件断点。
Dr7 LENn 字段将设置断点的长度,Dr0 到 Dr3 将保存断点地址。
来自 Intel Manual 3B - Chapter 18.2.5. "Breakpoint Field Recognition"
:
The LENn fields permit specification of a 1-, 2-, 4-, or 8-byte range, beginning at the linear address specified in the corresponding debug register (DRn).
在同一章节中明确指出:
Two-byte ranges must be aligned on word boundaries; 4-byte ranges must be aligned on doubleword boundaries.
如果你用足够长的数据断点覆盖所需的地址,那么它会陷入陷阱(断点会被击中):
A data breakpoint for reading or writing data is triggered if any of the bytes participating in an access is within the range defined by a breakpoint address register and its LENn field.
然后手册继续给出一个提示来捕获未对齐的地址并给出了一个例子table:
A data breakpoint for an unaligned operand can be constructed using two breakpoints, where each breakpoint is byte-aligned and the two breakpoints together cover the operand.