有没有办法在windbg中转储va_list的各个参数?

时间:2011-07-01 17:53:08

标签: windbg

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

1 个答案:

答案 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调用约定,因此您将在堆栈中找到相同类型的参数布局。