烦人的内存泄漏

昨天,今天一直在为内存泄漏的问题忙乎

 

程序代码写多了,而且不是一个人写的时候,很容易出现内存泄漏的问题。

 

今天把资源句柄好好的使用windbg查了一下,

 

/

1)找到windbgs安装目录下的gflags.exe工具,该工具可用来打开windows自带的一些调试选项,具体gflags.exe的详细使用可以查看windbg帮助; 这里我们设置勾上application verifiwer,该工具主要可用来对程序做一些稳定性的检测,本次调试主要用于保存栈的相关信息。同时设置stack backtrace即栈的大小为10.
2)运行windbg,打开第一步编译的程序,并使其跑起来;此时你查看任务管理器中的句柄信息,会发行相应进程句柄一直在增加。
3)windbg用ctrl+break命令中断进程运行,用!htrace -enable命令开启句柄检测;htrace提供了进行句柄相关检测的命令,可查看windbg帮助。 同时用g命令让程序运行。
4)再次中断进程,使用!htrace -snapshot命令,获得此时进程句柄的镜像。并再次让程序运行。
5)第三次中断进程运行,我们再使用!htrace -diff命令获得当前句柄状态与第4步 snapshot镜像句柄的差异; 我们可以发现:新增很多打开的句柄,平常情况下这些打开的句柄有可能不是泄露,需要具体分析,但是本次示例程序太简单,所以刚好所有打开的句柄都属于泄露的。
6)我们使用lsa 传递指定位置对应的代码,lsa handlew2!fun4+0x0000002e 到这里,我们就找到了泄露句柄的函数。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zdl1016/archive/2009/03/01/3948131.aspx

照着做了一遍,得到以下结果,也就是说我的资源没有泄露

 

0:001> !htrace -diff
Handle tracing information snapshot successfully taken.
0xe18 new stack traces since the previous snapshot.
Ignoring handles that were already closed...
--------------------------------------
No outstanding handles opened since the previous snapshot were detected.

 

 

 

昨天使用windbg查了下堆栈情况

0:001> !heap -s

获得当前的堆栈情况

 

运行一段时间

 

0:001> !heap -s

比较两次结果 找到明显异常的堆栈

 

0:001> !heap -stat -h 028e0000

查一下这个异常堆栈中的情况,有哪些大小的内存块,有多少

 

找到异常的内存大小,过滤一下

 

0:001> !heap -flt s 54

得到内存地址

 

0:001> !heap -p -a 内存地址

可以查到内存相关函数的名称

 

通过这个检测 ,发现我的一个第3方控件的一个函数有相当大的问题。加上今天除了用windbg还用了 purify来查也没有问题,看来这个控件的嫌疑最大。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值