2011-12-11 43 views
1

我有一個簡單的C++服務,它從文件中讀取文本並通過網絡發送它。隨着時間的推移,該服務的內存消耗在客戶現場增加。在QA測試中沒有觀察到這種行爲。使用WinDbg打印內存對象

我想知道是否有可能在任何給定的時間提取內存中的所有字符串對象。

是否有可能自動執行此過程,以便我可以在不同時間從客戶那裏獲取轉儲數據,並在每個時間查找內存的大小或內容並比較結果。

回答

1

這聽起來像你有內存泄漏。我只使用windbg來調試託管應用程序。也許這個Link可以幫助你一點。

+0

是的朋友,它看起來像只發生在客戶環境中的泄漏。感謝鏈接它有有用的信息。 – Geek

3

對於C++的答案是否定的(在C#是一個不同的故事)。在C++的世界裏,如果你懷疑你有泄漏,你可能想在發生「泄漏」之前在進程中啓用用戶模式堆棧跟蹤(gflags.exe中的+ ust)。發生泄漏之後,獲得過程轉儲並檢查它。爲了檢查它(我假設你在這個響應中使用本地窗口堆),你將需要遍歷堆結構以找出分配的位置,然後檢查堆棧回溯以獲取最常見分配大小的抽樣。

例子。

  1. 在您運行應用程序之前,運行gflags/i MyApp.exe + ust。這種設置,提供了OS爲如何處理過程中MyApp.exe的
  2. 運行程序,讓「壞行爲」的專項說明發生
  3. 收集過程的轉儲,而不良行爲是很容易的REGKEY看到(越容易看到,越容易將是找到)
  4. 打開轉儲在WinDbg中
  5. !堆-summary並與拉爾虛擬字節數
  6. 第一colomn是找到堆你的堆處理。使用上一步中找到的條目中的堆句柄並運行heap -stat -h -grp。這將列出使用給定堆中空間最多的堆分配。
  7. 因此,我們現在知道哪個堆很大,並且最常見的條目的大小。我們知道需要一些地址,所以我們可以看看分配給它們的調用堆棧。跑!堆-flt s。
  8. 最後一步(我們很近)。跑!堆-p -a。您現在將擁有堆棧回溯的代碼路徑生成此分配。現在你可以回到你的代碼,並找出爲什麼這不會被釋放。
1
+1

UMDH消耗由+ ust創建的數據。缺點是你必須在目標機器上設置符號。這是我剛抓住轉儲的主要原因,將其轉移到我的工具機器並查看那裏的數據。 – JasonE

+0

這是一個棘手的部分,是的 - 同樣的事情適用於ETL,你必須有目標機器的二進制副本進行匹配,並且UMDH不記錄校驗和信息來查找它 –