如何在 WinDbg 中使用 ba 命令(Break on Access)?

How to use the ba command (Break on Access) in WinDbg?

我有一个非常小的 C 程序:

#include <windows.h>

void funAdd() {
    int a = 2; // I want to break here
}

int CALLBACK
WinMain(HINSTANCE Instance,
    HINSTANCE PrevInstance,
    LPSTR CommandLine,
    int ShowCode)
{
    funAdd();
}

我想在 WinDbg 内部使用 break on access 来中断 funAdd() 函数。 visual studio 反汇编告诉我 int a = 2 指令位于内存地址 002416BC:

根据此处的文档:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/ba--break-on-access-

如果我编写命令 ba r4 02416be 我希望调试器在我的 funAdd() 函数内部中断,但是当我输入命令时我得到以下错误:Data breakpoint must be aligned

我理解正确吗?如果是这样,我如何正确地将此地址对齐到 4 个字节以匹配 r4 命令选项?

0x2416be是指令指针或指令的虚拟地址

要在此地址上设置访问断点你不应该使用 r 或 w 你应该使用 e

ba e 2416be 这不需要对齐或大小

如果您想在变量上设置数据断点 a

你必须找到一个的虚拟地址

编译器通常对齐变量地址,因此您通常不必担心对齐问题

使用dv /v a(局部变量显示需要私有pdb
并且由于 windbg 将本地 var 重命名为 a 而不是 ebp-xx 你应该拥有你的私有 pdb )

windbg 会吐出这样的结果 本地变量 a @xxxxxx

这里的xxxxx是变量a的地址(2会被存储

在地址中)

根据需要在此地址上使用 ba r4 或 r2 或 r1

请注意,此地址可能在堆栈中,并且此断点可能会在实际达到您的条件之前触发多次

数据读取断点对全局变量很有用 并且对于本质上是动态的本地地址和堆地址不太好

您可以指定任意函数地址到 dv 以查看函数局部变量(需要私有 pdb)

0:000> dv /v /i /t /f funadd!funAdd
prv local  <virtual frame 2ffa84>-0x0004       int myvar

执行到函数开始

0:000> g funadd!funAdd
eax=767fed5a ebx=7ffd4000 ecx=00000000 edx=01351000 esi=00000000 edi=00000000
eip=01351010 esp=002ffeb8 ebp=002ffebc iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
funadd!funAdd:
01351010 55              push    ebp

使用本地显示

0:000> dv /V /i /t
prv local  002ffeb0          <virtual frame 2ffeb4>-0x0004       int myvar = 0n0

使用 display type 命令也会给出本地的虚拟地址

0:000> dt -n myvar
Local var @ 0x2ffeb0 Type int
0n0

你可以在这个地址设置读断点

0:000> ba r4 0x2ffeb0

执行等你bp命中

0:000> g
Breakpoint 0 hit
eax=767fed5a ebx=7ffd4000 ecx=00000000 edx=01351000 esi=00000000 edi=00000000
eip=01351014 esp=002ffeb0 ebp=002ffeb4 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
funadd!funAdd+0x4:
01351014 c745fc02000000  mov     dword ptr [ebp-4],2 <<<<<<<<<  ss:0023:002ffeb0=00000000

该值尚未写入本地 myvar

0:000> bl
     0 e Disable Clear  002ffeb0 r 4 0001 (0001)  0:**** 


0:000> ? myvar
Evaluate expression: 3145392 = 002ffeb0

0:000> ? poi(myvar)
Evaluate expression: 0 = 00000000