內存泄漏分析工具tMemMonitor (TMM)使用簡介


         C/C++由於靈活、高效的優點一直以來都是主流的程序設計語言之一,但是其內存的分配與釋放均由程序員自己管理,當由於疏忽或錯誤造成程序未能釋放不再使用的內存時就會造成內存泄漏。在大型、復雜的應用程序中,內存泄漏往往是最常見的問題,因而及時解決內存泄漏非常必要。tMemMonitor (TMM)作為一個專業、准確、易用的內存泄漏分析工具,可以幫助C/C++程序員迅速地解決內存泄漏這個令人頭疼的問題。

   TMM下載地址(中文版): http://download.csdn.net/detail/tmemmonitor/9444634 

     TMM下載地址(英文版):  http://download.csdn.net/detail/tmemmonitor/9444660

 

一.背景

        目前市面上已有一些Windows平台下的內存泄漏動態檢測工具,比如UMDH,VLD,Purify,BoundsCheck等,其中Purify和BoundsCheck是昂貴的商用軟件,UMDH需要人工獲取內存快照,操作門檻較高,VLD則需要修改源程序的代碼,同時這幾款工具都存在誤報情況,因此准確性不高。針對Windows平台,C/C++程序員迫切需要一款專業、准確、易用的內存泄漏分析工具。

 

二.TMM簡介

         TMM是一款運行時C/C++內存泄漏檢測工具。TMM認為在進程退出時,堆內存中沒有被釋放且沒有指針指向的無主內存塊即為內存泄漏,並進而引入垃圾回收(GC, Garbage Collection)機制,在進程退出時檢測出堆內存中所有沒有被引用的內存單元,因而內存泄露檢測准確率為100%。

         TMM工具主要包含兩部分,第一部分是客戶端的檢測界面,客戶端部分主要負責監控目標進程中的內存行為並計算內存泄漏。檢測時只要將被檢測程序添加到監控列表中,然后正常運行被檢程序即可,以下為客戶端界面:

         另一部分是結果的展示與分析。TMM支持本地查看和在線查詢兩種方式。本地查看時,提供按泄漏次數或泄漏大小對結果進行排序的功能,並在安裝目錄的data文件夾中給出詳細分析報告。用戶也可憑QQ帳號登錄WeTest網站對內存泄漏情況進行在線查詢。以下為本地查看結果:

 

三.TMM的特性和優點

    專業

         Ø 最快的注入技術

         Ø 基於GC的精准算法,無需內存快照

         Ø 無損目標程序性能

         Ø 檢測結果精准定位到代碼堆棧信息

    准確

         Ø 二次遍歷堆內存對象里的指針

         Ø 寄存器級的問題跟蹤,完整掃描每個線程里32位寄存器內的指針

         Ø 不放過全局數據區里的內容

    易用

         Ø 支持自定義程序

         Ø 無須編譯,立即使用

         Ø 一鍵操作,無需切換

 

四.算法原理

1. 替換/注入堆內存分配函數的算法

         Windows中有多種級別的內存分配函數,其中,最底層的是ntdll.dll提供的Rtl系列函數,在這之上的有Windows API提供的heap管理函數,再上層,C/C++庫提供了malloc/free函數和new/delete操作符,因此替換如此層級復雜的函數比較困難,同時如果替換現有的堆分配函數,則無法做到和原有函數的執行效果完全一致,所以替換原生的堆分配函數對於Windows系統來說幾乎是不可行的,那么只能wrap(包裹)這些堆分配函數。

        Linux下的內存檢測工具,比如Valgrind就采用了包裹堆分配函數的方法,但它包裹的方法是不透明的,在調用棧中會多出額外一幀。TMM則采用全透明的包裹函數,將掛鈎函數分為前后二部分(如圖1所示)。在函數調用前執行per-hook函數,在函數返回前調用執行post-hook函數。有了前后掛鈎函數,TMM就可以在堆分配/釋放函數執行前獲得參數,並修改分配大小之類的參數;在函數執行后,記錄分配的大小和地址、調用棧之類的信息。

圖1

2. 泄露檢測的算法

       TMM使用基於堆內存可訪問性的內存泄露檢測法( reachability-based leak detection),該算法的核心就是檢測(掃描)沒有任何指針指向的堆內存,具體分為五步:

       Step 1. 進程退出時,suspend所有線程,防止數據在掃描過程中更改。假設此時進程中的堆內存布局如圖2所示;

圖2

        Step 2. 統計root-set,它由每個線程的寄存器、所有非堆內存、所有線程棧幀頂部RSP/ESP以上區域、所有庫的數據區組成;

        Step 3.    從root-set出發遍歷圖2,標記出有指針指向的內存塊,即beginning reachable blocks,如圖3中A、C;

圖3

        Step 4.   由於beginning reachable blocks也會包含有指針,因此通過遍歷beginning reachable blocks可以找出其內部指針指向的內存塊並標記,如圖4中B;

圖4

        Step 5.   統計檢測出來的內存泄漏,即圖4中unreachable的堆內存塊D、E、F。

 

 

五.使用步驟

圖5

             1. 在擁有Administrator權限的情況下啟動TMM。

          2. 在監控列表中右鍵添加目標程序,正常操作。 

          3. 正常退出目標程序。

          4. 耐心等待檢測結果生成(目標程序狀態由running變為null時,說明程序正常退出,檢測結果生成完畢)。 

          5. 查看結果。

 

六.注意事項   

            1.  安裝TMM時,用戶應具有Administrator權限,並且TMM不支持中文安裝路徑。

          2.  使用TMM時需要修改注冊表,如遇安全軟件彈窗警告,可將TMM加入信任列表放心使用。 

          3.  被檢測程序不能是加殼版本,因為加殼程序的函數名和函數地址已經混淆。

          4.  被檢測程序需是release版本。

          5.  如需在分析報告中顯示泄漏點詳細堆棧信息,請在被檢測程序同級目錄放置同版本的PDB文件,PDB解析時目錄不支持中文。

          6.  使用TMM導致被測程序退出時變慢屬於正常情況,此時TMM正在統計內存泄漏情況,請不要手動強制結束進程。

 

 

七.總結

          TMM適用於PC端所有C/C++程序的內存泄漏分析。對於被測程序,不需要修改源代碼,運行一次被測程序就能夠准確定位泄漏的文件名和行號。TMM是一款專業、准確、易用的內存泄漏檢測工具,值得每個程序員擁有。

    TMM下載地址(中文版): http://download.csdn.net/detail/tmemmonitor/9444634 

    TMM下載地址(英文版): http://download.csdn.net/detail/tmemmonitor/9444660

 

         QQ支持:        2304186838   

         聯系Email:    2304186838@qq.com  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM