有没有办法在windbg中转储va_列表的各个参数?

有没有办法在windbg中转储va_列表的各个参数?,windbg,Windbg,在给定格式字符串和va_列表的起始地址的情况下,有没有办法在windbg中转储va_列表中的参数?我通常使用命令dd esp for x86或dq rsp for x64转储堆栈内容。知道va_list的起始地址可以更容易地定位堆栈中vararg块开始的位置,但通常您可以猜测它,或者通过知道函数的常规非vararg参数的大小来计算 下面是x86的一个带注释的示例。函数被调用: printf("%d %o %g %s %c", 101, 201, 301.0, "401-string", '5')

在给定格式字符串和va_列表的起始地址的情况下,有没有办法在windbg中转储va_列表中的参数?

我通常使用命令dd esp for x86或dq rsp for 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调用约定,因此您将在堆栈中找到相同类型的参数布局