2011-09-06 122 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上,即使進行優化,您也可以獲得良好的堆棧跟蹤。