Почему вы не получаете полные трассировки стека при включении пользовательского режима трассировки стека?
Вопрос
Я устраняю некоторые проблемы с фрагментацией памяти, и я пытался выяснить, почему что-то распределяется и кто в конечном итоге выполняет это распределение.Итак, я включил трассировку стека пользовательского режима для процесса (+ флаг UST в gflags) и получил дамп.Когда я анализирую дамп и использую !куча -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
Решение
В 32-разрядной Windows система использует EBP chain для выполнения трассировки стека.Вам необходимо отключить оптимизацию FPO (/Oy-).В 64-разрядной Windows вы получите хорошую трассировку стека даже при оптимизации.