2011-09-06 4 views
3

일부 메모리 조각화 문제를 해결하는 중이고 문제가 왜 할당되는지 그리고 궁극적으로 누가 할당을 수행하는지 알아 내려고 노력했습니다. 그래서 usermode 스택 추적을 활성화하고 (gflags의 + UST 플래그) 덤프를 받았습니다. 내가 덤프를 분석하고! 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 런타임은 fpo를 사용합니다. 아마도 당신이 의존하고있는 다른 제 3자를 수행 할 것입니다. – deemok

답변

3

32 비트 Windows에서 시스템은 EBP 체인을 사용하여 스택 추적을 수행합니다. FPO 최적화 (/Oy-)를 비활성화해야합니다. 64 비트 Windows에서 최적화를 사용하더라도 좋은 스택 추적을 얻을 수 있습니다.

관련 문제