概述

项目接近尾声了,可是在运行时会有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. 实践认识--ANN

    1. 常用激活函数  激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数. (1) 线性函数 ( Liner Function ) (2) 斜面函数 ( Ramp Functio ...

  2. android wifi相关模块 命令列表 汇总

    static final int BASE =Protocol.BASE_WIFI;  131072 static final intCMD_START_SUPPLICANT  = BASE +11; ...

  3. WMS8_基本操作

    建立分拣[收货.出货.领料]         点击仪表盘上的任何一个 All operations 链接切换至分拣 列表视图         点击 creae 按钮,建立一个新的分拣     part ...

  4. 数据结构与算法系列----AC自己主动机

    一:概念 首先简要介绍一下AC自己主动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之中的一个.一个常见的样例就是给出n个单词,再给出一段 ...

  5. 【每日Scrum】第四天(4.14) TD学生助手Sprint1站立会议

    TD学生助手Sprint1站立会议(4.14) 任务看板 站立会议内容 组员 昨天 今天 困难 签到 刘铸辉 (组长) 今天早晨静姐调整了下界面和配色,下午和宝月兄一起做了GPS功能显示,暂时只能显示 ...

  6. How to reset your password in Ubuntu

    There are many reasons you might want to reset a password: Someone gave you a computer with Ubuntu i ...

  7. BUAAOO P13-P14 UML Interaction

  8. windows下的txt格式转换成linux下的TXT

    存在的问题是 多出一个方框或者黑格子 主要是因为bash 不能忽略windows的问题 用sed 命令来处理,分别是windows转linux,linux转windows sed -e 's/.$// ...

  9. CF 445A(DZY Loves Chessboard-BW填充)

    A. DZY Loves Chessboard time limit per test 1 second memory limit per test 256 megabytes input stand ...

  10. RTSP流媒体转发服务器源码

    最新EasyDarwin已经支持海康.大华等标准RTSP/RTP协议的转发,代码及使用方法参看:用Darwin开发RTSP级联服务器(拉模式转发)http://blog.csdn.net/xiejia ...