内存泄露分析


1.准备工具:windbg

2.准备环境:需要设置windbg符号路径

内存泄露分析demo

int _tmain(intargc, _TCHAR* argv[])
{
   while(TRUE)
   {
      char *p = newchar[1024];
      memset(p, 0, 1024);
      Sleep(1000);
   }
   return 0;
}


 

3.利用工具umdh(user-mode dump heap)分析


3.1设置gflags.exe标志

r

 

Gflags标志设置好后,开启cmd


键入要定位内存泄露的程序gflags.exe /I memroyleak.exe(程序名称)+ust

如图成功后,开启memoryleak.exe程序

3.2利用umdh创建heap快照


命令格式:umdh–pn:memoryleak.exe(程序名称) –f:snap1.log(日志名称)

程序运行一段时间后或者程序占用内存增加时,将memoryleak.exe退出。

然后再次创建heap快照,命令行无差别,snap1.log改为snap2.log或者其他。

设置好程序的符号路径,如下图


设置好后可以开始分析heap前后两个快照的差异


分析差异命令:umdh –d snap1.log snap2.log –f:result.txt



分析完成后查看结果result.txt

红色为umdh定位出来的泄露点,我们在查看源代码


这样我们就可以修改代码中内存泄露的地方了。

 

4.Windbg手动分析内存泄露

4.1全局标志设置,参照3.1

4.2.Windbg调试泄露

开启memoryleak.exe程序,windbg attach到该进程


命令:!heap –s查看当前进程运行的所有堆的情况

然后F5让程序运行一段时间或者内存有明显的增加时再次通过!heap –s查看当前堆的变化

如下图


通过对比前后两个堆的变化,发现0x012800000该地址的堆增加的很快而其他堆没什么变化

下面进一步定位


命令:!heap –stat –h 查看对应对的状态,发下该堆的内存基本被长度为0x424的块占用,接下来我们在堆中搜索该进程中哪些模块占用0x424长度内存,如下图


命令:!heap –flt s 424

通过搜索程序内存中的堆发现长度为424的堆被大量的占用,进一步查看时谁在使用这个地址


找到泄露点了,红色部分的,如果程序对应的符号对应我们可以查看内存泄露点在哪一行


内存泄露分析结束,如果你还有什么好的方法可以共享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值