私はこの非常に最小限の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内のアクセス時にブレークを使用して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
。
私はこれを正しく理解していますか?もしそうなら、r4
コマンドオプションに一致させるためにこのアドレスを4バイトに適切に整列させるにはどうすればよいですか?
0x2416beは、命令ポインタまたは命令の仮想アドレスです。
このアドレスにアクセスブレークポイントを設定するには、rまたはwを使用しないでください。eを使用する必要があります。
ba e 2416beこれは、位置合わせもサイズも必要ありません
あなたは、変数のデータブレークポイントを設定したい場合は、A
の仮想アドレスを見つける必要があります
コンパイラは通常、変数アドレスを整列するため、通常、整列について心配する必要はありません。
dv / vaを使用します(ローカル変数の表示にはプライベートpdbが必要で
あり、windbgがローカル変数の名前をebp-xxではなくローカル変数に変更したため、プライベートpdbが必要です)
windbgのは次のように結果を吐くだろう地元のVAR A @ XXXXXX
ここで、xxxxxは変数aのアドレスです(2が格納されます)
このアドレスで)
このアドレスで必要に応じてbar4またはr2またはr1を使用します
このアドレスはスタックにある可能性があり、このブレークポイントは実際に条件に達する前に何度も発生する可能性があることに注意してください
データ読み取りブレークポイントはグローバル変数に役立ちますが、本質的に動的なローカルアドレスやヒープアドレスにはあまり適していません
dvに任意の関数アドレスを指定して、関数localsを確認できます(private 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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加