Почему вы не получаете полные трассировки стека при включении трассировки стека в пользовательском режиме? - PullRequest
4 голосов
/ 06 сентября 2011

Я устраняю некоторые проблемы фрагментации памяти, и я пытался выяснить, почему что-то распределяется и кто в конечном итоге делает распределение.Поэтому я включил трассировки стека пользовательского режима для процесса (+ флаг UST в gflags) и получил дамп.Когда я анализирую дамп и использую! Heap -p -a Some_Address.Я вижу трассировку стека, но это определенно не полная трассировка.Я обычно вижу только 4-7 функций на трассе, а затем она останавливается.В стеке не сообщается об ошибках, но, к сожалению, в нем недостаточно информации.Я проверил кучу распределений, и все они, похоже, имеют такую ​​же проблему.Я думал, что это может быть размер базы данных стека, но я ожидал бы потерять целые записи, а не потерять их часть.Есть ли что-то, что я могу сделать, чтобы увеличить общий размер видимого стека.Ниже приведены некоторые примеры стеков, которые я вижу.

0:000> !heap -p -a 3cb49008
    address 3cb49008 found in
    _HEAP @ 80000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        3cb49000 0fdd 0000  [07]   3cb49008    07ed0 - (busy)
        Trace: 6b69
        7c855014 ntdll!RtlAllocateHeapSlowly+0x00000041
        7c83d9aa ntdll!RtlAllocateHeap+0x00000e9f
        776bcfce ole32!CRetailMalloc_Alloc+0x00000016
        77d0404a oleaut32!APP_DATA::AllocCachedMem+0x0000004f
        77d04341 oleaut32!SysAllocStringByteLen+0x0000003c
        77d03f9b oleaut32!ErrStringCopyNoNull+0x00000016
        77d0456f oleaut32!VariantCopy+0x0000007e
        3ff1946 xxxx!_variant_t::_variant_t+0x00000016


0:000> !heap -p -a 2774cfc8
    address 2774cfc8 found in
    _HEAP @ 3cc0000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        2774cfc0 0008 0000  [17]   2774cfc8    00020 - (busy)
        Trace: 7de8
        7c855014 ntdll!RtlAllocateHeapSlowly+0x00000041
        7c83d9aa ntdll!RtlAllocateHeap+0x00000e9f
        4f6ad17 xxxx!malloc+0x0000007a


0:000> !heap -p -a 3ca25e08
    address 3ca25e08 found in
    _HEAP @ 80000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        3ca25e00 0007 0000  [07]   3ca25e08    00020 - (busy)
        Trace: 8588
        7c855014 ntdll!RtlAllocateHeapSlowly+0x00000041
        7c83d9aa ntdll!RtlAllocateHeap+0x00000e9f
        776bcfce ole32!CRetailMalloc_Alloc+0x00000016
        77d0404a oleaut32!APP_DATA::AllocCachedMem+0x0000004f
        77d04341 oleaut32!SysAllocStringByteLen+0x0000003c
        77d03f9b oleaut32!ErrStringCopyNoNull+0x00000016
        77d0456f oleaut32!VariantCopy+0x0000007e
        4f35abd xxxx!std::_Construct<_variant_t,_variant_t>+0x0000004d

1 Ответ

3 голосов
/ 08 сентября 2011

В 32-битной Windows система использует цепочку EBP для отслеживания стека.Вам необходимо отключить оптимизацию FPO ( / Oy- ).В 64-битной Windows вы получите хорошую трассировку стека даже при оптимизации.

...