如何检测资源泄露

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC(Microsoft Foundation Class)是一种在Windows操作系统上用于开发桌面应用程序的框架。GDI(Graphical Device Interface)是Windows操作系统提供的绘图接口,用于绘制图形,处理字体和颜色等图形相关任务。MFC中使用GDI资源来进行图形绘制。 然而,由于MFC开发者需要手动管理GDI资源的分配和释放,在使用不当的情况下,容易出现资源泄露问题资源泄露指的是在程序运行过程中没有正确释放已经分配的资源,导致资源被浪费或无法再次使用的情况。 为了检测和解决MFC中的GDI资源泄露问题,可以使用一些专门的工具。这些工具通常可以通过分析程序运行时的内存和资源使用情况来检测资源泄露的位置和原因。 这些工具可以帮助开发者定位资源泄露的代码,并提供相应的解决方案。例如,可以提示开发者在适当的时候释放GDI资源,或者优化资源的使用方式,减少资源的浪费。 总之,MFCGDI资源泄露工具是一种帮助开发者检测和解决MFC应用程序中GDI资源泄露问题的工具。它可以帮助开发者找到资源泄露的原因,并提供相应的解决方案,以提高应用程序的性能和稳定性。 ### 回答2: MFC(Microsoft Foundation Class)是一套用于编写Windows应用程序的C++类库。GDI(图形设备接口)是Windows操作系统中的一组API,用于绘制图形和处理图形设备相关的操作。在使用MFC编写应用程序时,经常需要使用GDI资源进行图形绘制和处理。 然而,在使用MFC进行编程时,如果不注意释放使用的GDI资源,就会导致资源泄露问题资源泄露意味着应用程序在使用完一些资源后没有正确释放,最终导致系统资源耗尽,从而引发程序异常或崩溃。 为了帮助开发人员检测和修复应用程序中的GDI资源泄露问题,可以使用一些专门的工具,例如MFCGDI资源泄露工具。这类工具通常可以监测应用程序在运行过程中使用的GDI资源,记录下每个资源的创建和销毁过程,并提供相关的统计信息。 通过使用MFCGDI资源泄露工具,开发人员可以快速定位和解决应用程序中的资源泄露问题。这类工具通常会标记出未被释放的资源,提供调用栈信息以便查找资源泄露的根源,并提供相应的建议和解决方案。 在使用MFCGDI资源泄露工具时,开发人员应该先启动应用程序,并运行一段时间,让程序尽可能地达到各种使用GDI资源的情况。然后,通过工具提供的分析报告和日志信息,找出资源泄露的位置并进行修复。 综上所述,MFCGDI资源泄露工具是一种帮助开发人员检测和修复应用程序中的GDI资源泄露问题的工具。通过使用该工具,开发人员能够更好地优化应用程序的性能和稳定性,提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值