概述

项目接近尾声了,可是在运行时会有memory leak(内存泄露) bug.产品在运行一天后,内存增长致1.4G,而我们产品的初始内存才有70M,问题很严重,决定采用WinDbg工具来分析代码问题有原因到底在哪里.

WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。

WinDbg下载:

Install Debugging Tools for Windows 32-bit Version 
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx 
  Install Debugging Tools for Windows 64-bit Versions 
http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx

配置

在安装完WinDbg后,需要在我们开发电脑上配置两个环境变量值,_NT_ALT_SYMBOL_PATH(调试的bin目录)  和_NT_SYMBOL_PATH(symcache目录),如下图

_NT_ALT_SYMBOL_PATH(调试的bin目录):

_NT_SYMBOL_PATH(symcache目录)

还要再配置下这个:

接下来运行WinDbg

把要调试的进程加载进去

这时最好在内存溢出很明显的时候加载较好,等下调试时较明显.

以下适合调试C++代码(产品有用到C++库,是C++和C#一起写的代码,C#调用C++库)

运行命令

!heap -s

结果如下:

0:035> !heap -s 
  Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast 
                    (k)     (k)    (k)     (k) length      blocks cont. heap 
----------------------------------------------------------------------------- 
00250000 00000002    4096   3644   3672   1155   232     5    0      3   L  
    External fragmentation  31 % (232 free blocks) 
00360000 00001002    1088     72     72      1     0     1    0      0   L  
00370000 00008000      64     12     12     10     1     1    0      0      
016b0000 00001002      64     44     44      5     1     1    0      0   L  
017d0000 00041002     256     12     12      4     1     1    0      0   L  
01920000 00001002      64     44     44      5     1     1    0      0   L  
01a30000 00041002     256     40     40     12     3     1    0      0   L  
01c50000 00001002      64     32     32     24     1     1    0      0   L  
01f00000 00001002    1088    452    456     93    22     2    0      0   L  
02030000 00001002    7232   4828   5012    459   106    24    0      0   L  
021c0000 00001002      64     20     20      5     2     1    0      0   L  
04bb0000 00041002    1280    308    308      5     1     1    0      0   L  
05360000 00001002     256     16     16      3     1     1    0      0   L  
054a0000 00001002     256     12     12      4     1     1    0      0   L  
055e0000 00001002     256     12     12      4     1     1    0      0   L  
05720000 00001002     256     12     12      4     1     1    0      0   L  
05860000 00001002     256     12     12      4     1     1    0      0   L  
059c0000 00001002    3136   1772   1772    566    37     1    0      0      
    External fragmentation  31 % (37 free blocks) 
05ad0000 00001002     256     44     44      7     2     1    0      0   L  
05c10000 00001002     256     36     36     16     4     1    0      0   L  
080d0000 00001002    1088     56     84     47     4     3    0      0   L  
08740000 00001002    1024    524    628    480    14     7    0      0   L  
088b0000 00001002     256    160    200     25     5     2    0      0   L  
08dc0000 00001002      64     12     12      4     1     1    0      0   L  
09590000 00001002    1088    168    168      2     1     2    0      0   L  
0ce90000 00001002    1088     84     84     61     3     1    0      0   L  
-----------------------------------------------------------------------------

再运行命令 !heap –stat  -h  059c0000  因发现这个堆里有较大的内存占有量

结果如下图:

再运行 !heap -flt s 64 631 来查看堆里的内存分配

结果如下图

找堆里相似度高有地址,如上图,我的相似度非常高.

再运行!heap -p -a 0c903fe0

结果如下图

就会把调用到DLL的方法显示出来,就是内存泄露的地方,由于出于项目的保密原因,涉及项目中的代码中的信息我去掉了.

这只是WinDbg众多功能中的一种,我把它记录下来,因为这把我们项目的内存从1.4G降到了109M.功劳很大.

作者:spring yang

出处:http://www.cnblogs.com/springyangwc/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

WinDbg 调试工具的使用的更多相关文章

  1. Windbg 调试工具32位/64位版本下载

    最新的Windbg调试工具32位/64位版本越来越不好下载了,这里通过CSDN的渠道给大家一个下载地址,帮助大家更好下载工具: https://github.com/EasyDarwin/Tools/ ...

  2. Windbg调试工具命令详解

    .cls -------------------------------清屏 ~ ----------------------------------查看当前程序的所有线程 ~0s --------- ...

  3. Windbg 32位版本和64位版本的选择

    习惯了Vsiual Studio的兄弟们可能会因为先入为主的原因以为所有的调试器都应该像它那样,其实不然,当你安装Debugging Tools for Windows的时候,你将发现有两个系列的工具 ...

  4. Windows调试工具入门—1

    NetRoc http://www.DbgTech.net 引子 Debugging Tools for Windows是微软发布的一套用于软件调试的工具包(后面如果没有指明,那么我会使用WinDbg ...

  5. Windbg驱动双机调试环境配置

    [由于进入了Windows驱动编程领域第一步就是搭建环境,整个环境来说说难也不难,只是比较麻烦.文章有些地方比较繁琐的,而且别人写的比较好,作为引用参考直接贴连接了.如果你按照我写的一步步完成,很快就 ...

  6. .NET 调试入门(一) 调试工具的使用

    至于WinDbg的下载和基本配置网上到处都是,可以参考 http://www.cnblogs.com/happyhippy/archive/2007/04/08/710933.html   因为现在W ...

  7. VC++中开发汇编语言(转)

    汇编程序结构 一个显示字符串的汇编程序 程序格式 一.模式定义 二.includelib语句 三.函数声明语句 四.数据和代码部分 Visual C/C++环境 建立工程 汇编程序的调试 一.设置断点 ...

  8. Windows 7 驱动开发

    本文是对Win7(64)+VS2010+WDK7.1.0(WinDDK\7600.16385.1)开发驱动的小结. 一.系统工具 1.Win7(amd64位)系统 注:已装系统后,管理员身份运行cmd ...

  9. Windbg调试命令详解

    作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd. ...

随机推荐

  1. Linq查询满足条件记录集

    通过linq查询datatable数据集合满足条件的数据集 1.首先定义查询字段的变量,比方深度 string strDepth=查询深度的值: var dataRows = from datarow ...

  2. python numpy实现多次循环读取文件 等间隔过滤数据

    numpy的np.fromfile会出现如下的问题,只能一次性读取文件的内容,不能追加读取,连续两次的np.fromfile读到的东西一样 如果数据文件太大(几个G或以上)不能一次性全读进去,需要追加 ...

  3. 只列出所有监听 UNIX 端口 netstat -lx

    只列出所有监听 UNIX 端口 netstat -lx

  4. 网页Tab控件

    网页Tab控件 找到:http://www.open-open.com/ajax/2_Tabs.htm 页面,查看了若干Tab控件, 找到了:http://www.open-open.com/ajax ...

  5. git pull出现fatal: unable to access 'https://github.com/XXX/YYY.git'

    用cmd 发现ping不同 github.com Ping不通,这时候,只需要在host文件里做些修改就可以,首先,定位到路径 C:\Windows\System32\drivers\etc 找到ho ...

  6. 基于cucumber接口测试框架的扩展——测试框架总结之cucumber

    主要功能: 1.通过fiddler抓取请求,导出xml文件. 2.解析xml文件至excel,或者手工填写excel数据. 3.根据excel中的URL中地址生成的接口集合和feature内容模板生成 ...

  7. C#中异常处理和Java的区别

    捕获异常,同样是try...catch...,这个完全一样: 抛出异常,同样是throw,这个完全一样: 函数抛出怎样的异常,Java中可以用throws定义,而C#中不用定义,相当于throws E ...

  8. 【转】Windows2008上传大文件的解决方法(iis7解决上传大容量文件)

    2008上传大文件的解决方法:http://wenku.it168.com/d_000091739.shtml 2003上传大文件的解决方法:http://tech.v01.cn/windowsxit ...

  9. MFC小程序02————— 不规则窗体小应用程序

    什么不说了.先上程序截图: 执行结果是有一棵有星星在闪烁的圣诞树.还会循环播放背景音乐. 之前也是在网上看到类似的一个程序.然后自己近期也在学MFC.所以就模仿着写了一个, 当中使用的是GDI+来显示 ...

  10. bat+sqlcmd 批量执行脚本

    Hello,此BAT脚本能够帮助开发者将某目录下全部SQL脚本按文件名称依次在指定数据库中批量执行. 不用忍受powershell invoke-sqlcmd 的笨重.在指执行时多一种选择. bat文 ...