Есть ли способ сбросить отдельные аргументы va_list в windbg?

Есть ли способ сбросить аргументы в va_list в windbg, учитывая строку формата и начальный адрес va_list?


person Sriram Subramanian    schedule 01.07.2011    source источник


Ответы (1)


Обычно я делаю это, просто выгружая содержимое стека с помощью команды 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, поэтому вы найдете тот же тип расположения параметров в стеке.

person seva titov    schedule 02.07.2011