我有一個應用程序的堆損壞崩潰,所以我打開了從gflags的頁堆,並收集該應用程序的故障轉儲文件。堆腐敗雙釋放內存
從轉儲文件中,我發現它是由於雙重釋放內存。
下面是一個例子,從調用堆棧,我發現這個
msvcr100!free(void * pBlock = "**Address**")
然後我做了這個
!heap -p -a <address>
address found in
_HEAP @
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
Address 000a 0000 [02] address 00003 - **(free)**
Trace: <1>
<2>
<3>
所以我們可以看到,它正試圖雙重釋放內存,並且導致在崩潰。我的問題是我們能否在這個操作之前看到更改或釋放內存的調用堆棧?可能嗎?
我可以在!heap -p -a命令下看到一個跟蹤,是釋放內存的那個?如果是這樣,我只能看到調用堆棧的一部分,是否有任何方法可以看到總的調用堆棧或手動遍歷調用堆棧以查看哪個操作釋放了該塊內存。
您所要求的一臺時間機器,轉儲文件沒有一個。 –
是的,我知道轉儲文件在那個時間點是快照,但是如果啓用整頁堆可以提供更多的信息,而不是像誰試圖釋放內存一樣,那些已經釋放內存的人? – user2800803
您應該可以啓用頁堆以使您自己開始 - 頁堆使用位模式標記內存,以便更容易捕獲損壞(如雙重使用)。此外,這個鏈接應該是有幫助的:http://code.msdn.microsoft.com/windowsdesktop/CppHeapCorruption-7a727b6a – deemok