2011-09-06 72 views
3

我正在解决一些内存碎片问题,我一直在试图弄清楚为什么事情正在分配以及谁最终做了分配。所以我启用了进程的用户模式堆栈跟踪(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,因为您可能依赖的其他第三方 – deemok

回答

3

在32位Windows上,系统使用EBP链进行堆栈跟踪。您需要禁用FPO优化(/Oy-)。在64位Windows上,即使进行优化,您也可以获得良好的堆栈跟踪。