2011-09-06 3 views
3

Я искал некоторые проблемы фрагментации памяти, и я пытался выяснить, почему вещи выделяются и кто в конечном итоге выполняет выделение. Поэтому я включил трассировку стека usermode для процесса (флаг 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 
+0

Просто интересно - произойдет ли ваше построение с [пропустить указатели на рамки] (http://msdn.microsoft.com/en-us/library/2kxx5t2c (v = VS.100) .aspx)? – eran

+0

Я только что проверил проект, и, похоже, мы не используем FPO. Поэтому не должно быть проблем FPO. – Zipper

+0

vs2005 runtime использует fpo, так как, возможно, другие сторонние стороны, на которые вы можете полагаться – deemok

ответ

3

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

 Смежные вопросы

  • Нет связанных вопросов^_^