0
フォーマット文字列とva_listの開始アドレスを指定して、windbgのva_listに引数をダンプする方法はありますか?windbgにva_listの個々の引数をダンプする方法はありますか?
フォーマット文字列とva_listの開始アドレスを指定して、windbgのva_listに引数をダンプする方法はありますか?windbgにva_listの個々の引数をダンプする方法はありますか?
通常は、コマンドdd esp
(x86の場合)またはdq rsp
(x64の場合)を使用してスタックの内容をダンプするだけです。 va_listの開始アドレスを知ることで、varargブロックが始まるスタック内の場所を見つけるのが少し楽になりますが、通常は、関数に対して通常の(可変ではない)パラメータのサイズを知って計算するか、計算することができます。
ここにはx86の注釈付きの例があります。関数が呼び出されるbeeingて:
printf("%d %o %g %s %c", 101, 201, 301.0, "401-string", '5');
デバッガで:その他の機能については
0:000> bp MSVCR100D!printf
0:000> g
Breakpoint 1 hit
eax=00000001 ebx=00000000 ecx=2549afc4 edx=00000000 esi=002ceeb8 edi=002cf040
eip=0ff57ee0 esp=002cee98 ebp=002cf04c iopl=0 nv up ei pl nz ac po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000212
MSVCR100D!printf:
0ff57ee0 8bff mov edi,edi
0:000> dd /c1 esp
002cee98 01365cee // return address
002cee9c 0137d6e8 // pointer to the format string "%d %o %g %s %c" --> next follows our variable arguments
002ceea0 00000065 // first vararg argument, int 101
002ceea4 000000c9 // second vararg argument, int 201
002ceea8 00000000 // third vararg argument, double 301.0, it occupies two slots in stack
002ceeac 4072d000 // third argument continues
002ceeb0 0137d70c // fourth vararg argument, pointer to string
002ceeb4 00000035 // fifth vararg argument, 8-bit character (still occupies 4 bytes in stack)
002ceeb8 25b87244
002ceebc 002cf254
002ceec0 0041c520
002ceec4 00000000
...
、それは非常に似ています、引数の変数番号を使用するすべての関数は呼び出し規約__cdecl次する必要があるため、あなたのように、スタック内に同じ種類のレイアウトのパラメータがあります。