簡體   English   中英

虛擬地址空間碎片

[英]Virtual Address Space Fragmentation

我正在研究虛擬地址空間碎片。 我的問題是對VirtualAlloc的調用可以有許多來源(LOH,內存映射等)

我可以從轉儲文件中識別函數的調用者嗎? 弄清楚我問題的根源?

您必須為您的應用啟用gflags用戶堆棧跟蹤,您可以從命令行或在WinDbg(如果是WinDbg)中執行以下操作:

!gflag +ust

那么對於給定的!heap -stat -h XX您需要執行!heap -s!heap -stat -h XX將轉儲更多特定的統計信息,我建議在此處執行內存轉儲.dump /ma c:\\first.dmp然后執行該操作導致碎片,請按ctrl+break break重新進入WinDbg,然后再次輸入!heap -s並執行另一個內存轉儲.dump /ma c:\\second.dmp

內存轉儲和堆摘要的原因是,您可以分析正在增加或返回的堆,打開轉儲並對這些快照進行分析,將結果轉儲到文本文件中,並對結果進行比較。

因此,如果您發現一個正在增加的特定堆塊,那么您可以轉儲該塊的每個分配!heap -p -a xxxx其中xxxx是您的堆塊,建議您設置WinDbg將輸出寫入文件,因為這將是非常大的.logfile c:\\first.txt在第二個內存轉儲上重復,並進行比較以查看發生了哪些其他分配。

另外,您可以轉儲堆的統計信息,這將使您獲得分配大小的詳細信息,這也可能會為您提供線索。 無論如何,只要您的pdb帶有專用符號,您就可以確定誰使用完整的調用堆棧進行了分配。

編輯

有一篇文章可能會對您有所幫助: http : //bugslasher.net/2011/01/15/memory-exhaustion-even-if-a-large-enough-free-memory-segment-is-available/

如果可以獲取虛擬地址,則可以使用!pte addresspfn frameNum轉儲其他信息,您可以獲取虛擬地址的頁面框架號,該頁號可以從!pte的結果中獲取。

!vm 1將顯示有關虛擬內存使用情況的一些統計信息,但不多得多,另一件事是,您可以在對virtualAlloc的調用上設置斷點,並轉儲調用堆棧和局部變量(如果使用kf則將以字節為單位顯示距離在可能表示分配量很大的堆棧幀之間,我會將這些信息寫到日志文件中,然后在兩個轉儲之間進行比較。

首先,必須為OS組件和程序設置pdb符號:在符號路徑窗口中設置如下字符串

srv * f:\\ symbols \\ websymbols * http://msdl.microsoft.com/download/symbols

並添加程序私有符號的路徑。 完成此操作后,您可以在命令kb上看到誘餌堆棧跟蹤。 程序在堆棧中的首次出現是調用程序功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM