如何在 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
我有一个非常小的 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