WinDbg 调试工具的使用

简介: 概述项目接近尾声了,可是在运行时会有memory leak(内存泄露) bug.产品在运行一天后,内存增长致1.4G,而我们产品的初始内存才有70M,问题很严重,决定采用WinDbg工具来分析代码问题有原因到底在哪里.WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。

概述

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

 

还要再配置下这个:

image

接下来运行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/

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

目录
相关文章
|
6天前
|
Web App开发 监控 JavaScript
调试器可以做什么
【4月更文挑战第11天】调试器是程序员诊断和修复程序错误的必备工具,提供执行控制(如逐行执行、设置断点)、变量值实时监控、函数调用堆栈跟踪、内存使用情况监视及异常处理等功能。JavaScript开发者可利用Chrome DevTools和Firefox DevTools等进行高效调试。调试器极大地助力了问题定位与修复。
17 5
|
7月前
|
存储
调试实战——使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs
使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs
驱动开发:WinDBG 常用调试命令总结
Windbg是Microsoft公司免费调试器调试集合中的GUI的调试器,支持Source和Assembly两种模式的调试。Windbg不仅可以调试应用程序,还可以进行Kernel Debug。结合Microsoft的Symbol Server,可以获取系统符号文件,便于应用程序和内核的调试。Windbg支持的平台包括X86、IA64、AMD64。
412 0
|
NoSQL 5G Linux
用WinDbg断点调试FFmpeg
用WinDbg断点调试FFmpeg
108 0
|
C# C++ Windows
WinDbg 调试工具的使用
概述 项目接近尾声了,可是在运行时会有memory leak(内存泄露) bug.产品在运行一天后,内存增长致1.4G,而我们产品的初始内存才有70M,问题很严重,决定采用WinDbg工具来分析代码问题有原因到底在哪里. WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。
1100 0
|
存储 Java .NET
Windbg程序调试--转载
WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。 WinDbg是微软很重要的诊断调试工具: 可以查看源代码、设置断点、查看变量, 查看调用堆栈及内存情况。
2127 0
|
应用服务中间件 nginx
|
C++ Windows
调试工具
BoundsChecker 能自动指出静态,堆栈内存错误和资源泄漏问题。与一般的内存检测工具不同,BoundsChecker 能够校验最新的 Windows APIs,包括 ActiveX, DirectX, OLE/COM, ODBC等等。
1175 0
|
Web App开发 NoSQL Linux
使用GDB命令行调试器调试C/C++程序【转】
转自:https://linux.cn/article-4302-1.html 编译自:http://xmodulo.com/gdb-command-line-debugger.html作者: Adrien Brochard原创:LCTT https://linux.
1346 0