在给定格式字符串和va_list的起始地址的情况下,有没有办法在windbg中转储va_list中的参数?
答案 0 :(得分:0)
我通常只使用命令dd esp
(对于x86)或dq rsp
(对于x64)转储堆栈的内容。知道va_list的起始地址可以更容易地找到堆栈中vararg块开始的位置,但通常你可以猜测它或通过知道函数的常规(非vararg参数)的大小来计算。
这是x86的注释示例。函数叫做:
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调用约定,因此您将在堆栈中找到相同类型的参数布局。