zoukankan      html  css  js  c++  java
  • WinDbg 调试工具的使用

    概述

    项目接近尾声了,可是在运行时会有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目录):

    1

    _NT_SYMBOL_PATH(symcache目录)

    2

    接下来运行WinDbg

    3

    把要调试的进程加载进去

    4

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

    以下适合调试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  因发现这个堆里有较大的内存占有量

    结果如下图:

    image 

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

    结果如下图

    image

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

    再运行!heap -p -a 0c903fe0

    结果如下图

    image

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

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

    作者:spring yang

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

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

  • 相关阅读:
    免费的编程中文书籍索引
    整理书签博客和文章
    【De8ug玩docker】-Docker常用命令操作
    Linux中的那些英文缩写和她的含义们
    Docker和DevOps是找工作必备技能
    【De8ug玩docker】-命令行只显示-bash-4.1#
    应该知道的Linux技巧
    阿里云服务器linux(centos)常用命令
    jQuery运维开发之第十七天
    js+dom开发第十六天
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2289479.html
Copyright © 2011-2022 走看看