SleuthQA CodeWatch 跟踪程序资源泄漏

某日,一个我编写的Delphi 应用(dll 插件)被发现运行一段时间后,系统的PF 占用其高且下不来。

后在任务管理器中发现此应用所在的exe 在运行期间的句柄计数会稳定累积增加, user对象、GDI对象计数未发现明显异常。

使用SleuthQA CodeWatch( 以下简称 CW) 调试此dll, 过程如下:

 

 

Step1. 准备工作

 

1.1  CW-File-NewProject,选择要分析的模块,即本应用的dll

 

 

 

1.2 选择模块对应的Host EXE

 

 

Step 2 运行应用,采集信息

 

1.3 CW 主界面,点击执行程序,正常进行操作,CW自动采集EXE执行期间的event。

 

 

Step 3 结束exe, 查看采集的信息

 

3.1 正常退出exe,CW弹出初步结果, 这里可以看到在刚才的运行期间中该DLL发生了3次未预计的操作系统资源泄漏 、1次捕获的内存泄漏

 

 

3.2 这里可以看到3次的资源泄漏其实是-1个window未关闭、1个process handle、1个ThreadHandle未关闭。窗口泄漏的根源发现是在某个单元中创建TTimer未释放,VCL的TTimer其实就是开个窗口接收WM_TIMER,暂且不表。

 

 

 

3.3 泄漏时的线程栈表明发生在 uExtractor1.pas 181行处,代码片断如下。 此处创建了一个额外的工作exe,如果该工作exe在规定时间内正常退出则会关闭该工作exe的进程、线程句柄;但是如果超时了,会调用另一个公共函数 KillProc 杀掉该exe及其子孙进程,这里范了错误,在杀掉后没有关闭该exe的句柄。

 

 

 

3.4 修改代码即使KillProc 也要关闭 hProcess hThread。 OK! 泄漏问题解决

 

 

总结:

 

1. Dll 的代码一定要谨慎编写,因为申请的系统资源都是隶属于主调exe的,主调exe不退出,中间泄漏的资源操作系统都没办法帮你自动回收;

 

2. CreateProcess后打开的进程句柄一定要释放,即使该程序被另外的地方杀掉了,因为只要一处打开的句柄不关闭,操作系统为该进程维护的内核对象的句柄计数都不会减到0,导致泄漏

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值