天天看點

記憶體洩漏檢測工具vmmap使用指南

先上vmmap工具下載下傳連結:

連結:https://pan.baidu.com/s/1EqdKrVR-BXdGAmIOmYcWYw 

提取碼:2af3 

一、什麼是記憶體洩漏?

記憶體洩漏是指程式配置設定記憶體,然後在不再需要時不将其歸還。洩漏的記憶體被浪費了,因為程式本身不再使用它,但在程式退出之前沒有其他東西可以使用它。

高記憶體使用率并不總是意味着存在記憶體洩漏。如果您正在做的事情本身就需要大量記憶體,并且在操作完成後該記憶體被返還,那麼這不是記憶體洩漏。

記憶體洩漏通常是無界。如果你繼續做一些觸發洩漏的事情,那麼記憶體使用通常會不斷增加。(如果記憶體使用量隻在你第一次做某事時增加,而且增加不是很大,那麼它可能隻是一個配置設定緩存的元件,它将重新使用它以加快未來的操作。這樣的緩存通常在一個幾分鐘不活動,盡管這取決于元件。)

二、使用 VMMap 查找記憶體洩漏

如果您使用任務管理器檢視,它可能會說 explorer.exe 或 dopus.exe 正在使用大量記憶體,但它不會告訴您在哪裡責怪謊言。程式本身可能存在錯誤,但它幾乎總是第三方元件。這是找出哪一個的方法。

下載下傳免費的 VMMap 工具從 Microsoft/SysInternals 中提取其 zip 檔案。VMMap 是一個低級調試工具,但别擔心,我們要用它做的事情很簡單。

1. 輕按兩下 VMMap.exe,它應該會打開一個包含正在運作的程序清單的視窗。

在該視窗的頂部,單擊Launch and trace a new process頁籤,然後輸入 dopus.exe 的路徑,如下所示。

不要單擊“确定”。

記憶體洩漏檢測工具vmmap使用指南

2. 在點選确定之前,您需要退出 Directory Opus (dopus.exe),以便 VMMap 重新啟動它。(這将允許 VMMap 記錄新 dopus.exe 所做的記憶體配置設定。) 預設情況下,

簡單地關閉所有 Opus 視窗不會退出它。使用 Opus 托盤圖示菜單上的退出選項。(另請參閱:如何退出 Directory Opus。)

3. 現在在 VMMap 中點選 OK;它應該重新啟動 Opus。

VMMap 還會顯示一個彩色數字清單,但不要擔心了解它們。:)

保持 VMMap 和 Opus 運作;從現在開始不要關閉它們中的任何一個。

4. 以觸發記憶體洩漏的方式使用 Directory Opus。

理想情況下,多次觸發洩漏,使其大而容易找到。(如果可以的話,讓它至少洩漏 10MB,或者更多,這樣它就可以從其他記憶體配置設定中脫穎而出。)

使用标準的任務管理器來關注 dopus.exe 的記憶體使用情況,這樣你就可以知道何時觸發了洩漏.

5. 傳回 VMMap 并按F5(或單擊View -> Refresh)使其重新整理。

6. 單擊VMMap 視窗底部的Trace...:

記憶體洩漏檢測工具vmmap使用指南

7. 在出現的跟蹤視窗中,按位元組列排序并滾動到清單頂部。

它應該看起來像這樣,其中第一項的 Bytes 值比其他項大得多: 如果第一項沒有相對較大的 Bytes 值,那麼您可能需要多次觸發洩漏(保持 VMMap 運作并記住每次回到它時都要重新整理它),否則您可能根本不正确地認為存在洩漏。否則,繼續...

記憶體洩漏檢測工具vmmap使用指南

8. 選擇第一項,然後單擊Trace 視窗底部的Stack...。

9. 您現在将看到配置設定記憶體時涉及的 DLL(和 dopus.exe)清單,如下所示: 導緻記憶體洩漏的元件通常是清單中的第一個非 Windows DLL。您通常可以忽略路徑以C:\Windows開頭的那些(例如 ntdll.dll 和 user32.dll)。 在上面的例子中,記憶體洩漏是由 LeakyShellExtension.dll 引起的,你可以猜到,這是我為本指南編寫的一個 shell 擴充,它故意洩漏記憶體。我寫它是為了每次右鍵單擊一個檔案時洩漏大約 10MB,然後右鍵單擊檔案幾次,使其總共洩漏大約 70MB。

記憶體洩漏檢測工具vmmap使用指南

10.一旦你有一個可疑的DLL,名稱和路徑通常足以識别它屬于什麼。如果沒有,請在磁盤上找到 DLL,右鍵單擊它,選擇“屬性”,然後轉到“詳細資訊”頁籤。這通常包含有關誰制作它以及它是什麼的資訊。

有時也值得檢視清單中的其他一些 DLL。

一旦您知道 DLL 屬于什麼,您可以嘗試解除安裝(或更新)它以檢視洩漏是否消失。

如果洩漏消失,那麼您就知道向誰報告錯誤。

如果洩漏仍然存在,請重複該過程并檢視訓示了哪些 DLL。如果它又是同一個 DLL,那麼您就知道您沒有成功解除安裝它。如果它是另一個 DLL,也許第一個是無辜的,可以重新安裝。

三、vmmap記憶體名額詳解

任務管理器中關于記憶體的兩個重要概念:private和working set。但是記憶體遠不止那麼簡單,下面我根據VMMap來詳細介紹一下記憶體的分類。

記憶體是一個很複雜的系統,其中的paging file,sharable memory,reserve和commit等概念使得要算清楚一個程序到底使用了多少記憶體幾乎成了不可能的事情了。

還好我們有VMMap這個工具,它用兩個緯度将記憶體進行了詳細的劃分。

一個是縱向的緯度,也就是記憶體是從哪裡來的。分為

1、Image(可執行檔案),

2、Mapped file(由CreateFileMapping以檔案作為back up)。

3、Sharable(由CreateFileMapping以記憶體作為 back up)

4、Private Data(由Virtual Alloc配置設定)

5、Heap(由new,GlobalAlloc和HeapAlloc等配置設定)

6、Stack(棧占用的控件)

7、Page table(核心裡面維護目前虛拟位址控件所需要的記憶體)

8、Managed Heap(由.NET garbage collector配置設定和管理)

記憶體洩漏檢測工具vmmap使用指南

還有一個橫向的維護,分别被稱為:

Size: 總體大小,包括了commit和沒有reservce的記憶體。如果這項和Committed不 一緻,那麼就是說有reserve的記憶體。

Committed: committed的大小,包括Private記憶體和可共享的記憶體。

Private:屬于目前程序的虛拟記憶體,指的是當你修改他時僅僅目前程序會受到影響。(copy-on-wirte屬性的頁面還沒被修改時也屬于此類)

以上實際上是虛拟記憶體(virtual memory)的概念,其中的内容可能被實體記憶體(physical memory)back up,也可能被Paging file back up。

而以下的幾個名額指的是實體記憶體:

Total WS: 所有的working set,包括private working set和sharable working set。

Private WS: private working set。僅屬于目前程序的working set。

Sharable WS。可共享的working set。

Shared WS。已經共享的working set,這個值應該是sharable working set的一部分或者全部。

四、vmmap實踐驗證總結

實際運作應用程式各個記憶體區域的使用情況如下圖(F5重新整理):

記憶體洩漏檢測工具vmmap使用指南

繼續閱讀