WinDbg 调试工具的入门使用

时间:2021-05-06 10:52:27

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目录):

WinDbg 调试工具的入门使用

_NT_SYMBOL_PATH(symcache目录)

WinDbg 调试工具的入门使用

 

还要再配置下这个:

WinDbg 调试工具的入门使用

接下来运行WinDbg

WinDbg 调试工具的入门使用

把要调试的进程加载进去

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  因发现这个堆里有较大的内存占有量

结果如下图:

WinDbg 调试工具的入门使用 

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

结果如下图

WinDbg 调试工具的入门使用

 

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

再运行!heap -p -a 0c903fe0

结果如下图

WinDbg 调试工具的入门使用

 

就会把调用到DLL的方法显示出来,就是内存泄露的地方.