Есть ли способ в windbg создать точку останова, которая будет срабатывать при передаче определенного параметра в стек? - PullRequest
2 голосов
/ 19 октября 2011

Я пытаюсь отследить, кто делает выделение определенного размера, и я пытался использовать трассировку стека в режиме пользователя (gflags + ust), но из-за FPO я не вижу весь стек.Поэтому вместо этого я хотел установить точку останова на RtlAllocateHeap, когда он делает размер выделения, который я ищу.Единственная проблема в том, что я не могу найти способ заставить это работать.

Сначала я попытался использовать @esi, так как казалось, что третий параметр передается через этот регистр, но это не так.Похоже, это всегда так.Тогда я попытался @ ebp-c дать мне третий параметр, но это не всегда работает, поэтому я попытался @ esp + 14, и это тоже не сработало.

Независимо от того, что яНе могу ли я найти способ заставить это сработать, когда захочу.Кажется, что это должно сработать, но я предполагаю, что в некоторых случаях он использует функции листовой оптимизации, что не позволяет мне сделать это.

У кого-то есть идеи, как заставить это работать.

Трассировка стека кучи:

0:013> !heap -p -a 0c060710    
address 0c060710 found in
_HEAP @ 1420000
  HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
    0c0606f8 09c3 0000  [00]   0c060710    04e00 - (busy)
    77abb234 ntdll!RtlAllocateHeap+0x00000274
    75ee404b ole32!CRetailMalloc_Alloc+0x00000016
    76454557 OLEAUT32!APP_DATA::AllocCachedMem+0x00000060
    7645476a OLEAUT32!SysAllocStringByteLen+0x0000003d
    764547bf OLEAUT32!ErrStringCopyNoNull+0x00000016
    764547e3 OLEAUT32!VariantCopy+0x0000007f

Пробованные точки останова:

 bp ntdll!RtlAllocateHeap "j @esi == 0x4e00 ''; 'gc'"
 bp ntdll!RtlAllocateHeap "j poi(@ebp-c) == 0x4e00 ''; 'gc'"
 bp ntdll!RtlAllocateHeap "j poi(@esp+14) == 0x4e00 ''; 'gc'"

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Я думаю, что я проверял это: Разрыв по размеру выделения == 1303

bp ntdll! RtlAllocateHeap "j (poi (@ esp + c) = 0x1303) 'k'; 'gc'"

1 голос
/ 20 октября 2011

Использование poi(@esp+c)

При первой инструкции функции у вас нет EBP. Таким образом, структура в стеке для cdecl и stdcall:

<return address>
<First arg>
<second arg>

и т.д..

...