zoukankan      html  css  js  c++  java
  • 内存泄露分析

    .准备工具:windbg

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

    内存泄露分析demo

    1. int _tmain(intargc, _TCHAR* argv[])  
    2. {  
    3.    while(TRUE)  
    4.    {  
    5.       char *p = newchar[1024];  
    6.       memset(p, 0, 1024);  
    7.       Sleep(1000);  
    8.    }  
    9.    return 0;  
    10. }  



    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的堆被大量的占用,进一步查看时谁在使用这个地址

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

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

  • 相关阅读:
    关于图片或者文件在数据库的存储方式归纳
    js默认比较第一个数字大小
    项目中empty遇到的一个问题
    thinkphp 一个页面使用2次分页的方法
    mysql处理海量数据时的一些优化查询速度方法
    项目中的一个和分页总数有关的子查询
    Mysql乱码
    HTML 5 <input> placeholder 属性
    form 表单jquery验证插件使用
    在网站制作中随时可用的10个 HTML5 代码片段
  • 原文地址:https://www.cnblogs.com/jinjiangongzuoshi/p/4329376.html
Copyright © 2011-2022 走看看