日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

内存泄漏分析工具tMemMonitor (TMM)使用简介

發布時間:2024/6/21 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 内存泄漏分析工具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,GarbageCollection)機制,在進程退出時檢測出堆內存中所有沒有被引用的內存單元,因而內存泄露檢測準確率為100%。

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

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

三.TMM的特性和優點

專業

?最快的注入技術

?基于GC的精準算法,無需內存快照

?無損目標程序性能

?檢測結果精準定位到代碼堆棧信息

準確

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

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

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

易用

?支持自定義程序

?無須編譯,立即使用

?一鍵操作,無需切換

四.算法原理

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

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

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

圖1

2.泄露檢測的算法

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

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

圖2

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

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

圖3

Step 4. 由于beginningreachableblocks也會包含有指針,因此通過遍歷beginningreachableblocks可以找出其內部指針指向的內存塊并標記,如圖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

總結

以上是生活随笔為你收集整理的内存泄漏分析工具tMemMonitor (TMM)使用简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。