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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何检测资源泄露

發布時間:2023/12/31 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何检测资源泄露 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Window上我們常見的資源泄露包括內存和對象句柄泄露, 下面討論下對各類泄露的檢測方法。關于內存泄漏,我以前寫過2篇文章:?C++中基于Crt的內存泄漏檢測,?基于WinDbg的內存泄漏分析用上面提到的方法檢測泄露很多時候太麻煩,所以有時候我們會考慮用工具 VLD:

Visual Leak Detector源于Code ProjectVisual Leak Detector - Enhanced Memory Leak Detection for Visual C++,?安裝包可以到?這里?下載。

使用很簡單,基本上安裝完了就之可以直接用, 具體可以參考?這篇


關于對象句柄泄露, 主要分GDI對象,Kernel對象,User對象:

GDI對象只在本進程有效,主要是指Brush, Pen,DC等, 具體可以參考?這里

User對象只在同一Session內有效,同一user對象在不同進程內值都相等,可以跨進程使用, 主要是指Menu, window, cursor, hook等,具體可以參考?這里

Kernel對象可以跨進程使用, 但是因為每個進程都有自己的內核對象表,所以同一對象的句柄值在不同進程里會不相等(盡管最終指向同一個內核對象),主要是指各類HANDLE,具體可以參考?這里


對于對象句柄泄露,免費來說沒有太好的工具可以直接使用, 很多時候我們可以直接通過任務管理器來觀察各類對象的個數, 如果有持續增長, 則說明有泄露存在。很多時候GDI泄露是大頭,我們要判斷哪類GDI對象正在泄露,可以考慮使用工具GDIView。(對于對象句柄泄露,誰有好的工具,可以提示下。)


對于內核對象泄露,我們可以考慮使用WinDbg的 !htrace 命令, 使用很簡單:通過 !htrace -enable 命令打開棧回溯, 然后通過 !htrace -snapshot 命令保存一個當前所有句柄的快照, 最后再通過 -htrace -diff 命令獲取所有前面保存快照后打開但沒有關閉的句柄對象。


如果公司有錢,可以考慮購買Boudcheck, 這個工具非常強大,可以幫我們快速的檢測出各類內存和對象泄露,包括API的參數錯誤等。思考Boundcheck的實現原理,實際上并不復雜,主要就是API Hook, 大概過程如下:

(1) 將注入對方進程

(2) 通過API Hook替代系統資源分配和釋放相關的API, 并且記錄調用棧

(3)最后檢測沒有釋放的資源, 生成報表


這里有篇文章告訴你如何開發類似的工具:LeakMon - Track Handle leak, GDI Leak and Memory Leak in your Applications

當然盡管原理很簡單,但是因為Windows的API種類繁多,并且在新版本中會常有增加, 要開發一個完整的工具也不是一件容易的事情。

轉載于:https://www.cnblogs.com/weiym/p/3940502.html

總結

以上是生活随笔為你收集整理的如何检测资源泄露的全部內容,希望文章能夠幫你解決所遇到的問題。

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