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目录):
_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 调试工具的使用的更多相关文章
- Windbg 调试工具32位/64位版本下载
最新的Windbg调试工具32位/64位版本越来越不好下载了,这里通过CSDN的渠道给大家一个下载地址,帮助大家更好下载工具: https://github.com/EasyDarwin/Tools/ ...
- Windbg调试工具命令详解
.cls -------------------------------清屏 ~ ----------------------------------查看当前程序的所有线程 ~0s --------- ...
- Windbg 32位版本和64位版本的选择
习惯了Vsiual Studio的兄弟们可能会因为先入为主的原因以为所有的调试器都应该像它那样,其实不然,当你安装Debugging Tools for Windows的时候,你将发现有两个系列的工具 ...
- Windows调试工具入门—1
NetRoc http://www.DbgTech.net 引子 Debugging Tools for Windows是微软发布的一套用于软件调试的工具包(后面如果没有指明,那么我会使用WinDbg ...
- Windbg驱动双机调试环境配置
[由于进入了Windows驱动编程领域第一步就是搭建环境,整个环境来说说难也不难,只是比较麻烦.文章有些地方比较繁琐的,而且别人写的比较好,作为引用参考直接贴连接了.如果你按照我写的一步步完成,很快就 ...
- .NET 调试入门(一) 调试工具的使用
至于WinDbg的下载和基本配置网上到处都是,可以参考 http://www.cnblogs.com/happyhippy/archive/2007/04/08/710933.html 因为现在W ...
- VC++中开发汇编语言(转)
汇编程序结构 一个显示字符串的汇编程序 程序格式 一.模式定义 二.includelib语句 三.函数声明语句 四.数据和代码部分 Visual C/C++环境 建立工程 汇编程序的调试 一.设置断点 ...
- Windows 7 驱动开发
本文是对Win7(64)+VS2010+WDK7.1.0(WinDDK\7600.16385.1)开发驱动的小结. 一.系统工具 1.Win7(amd64位)系统 注:已装系统后,管理员身份运行cmd ...
- Windbg调试命令详解
作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd. ...
随机推荐
- 理解Neural Style
paperA Neural Algorithm of Artistic Style 在艺术领域,尤其是绘画,艺术家们通过创造不同的内容与风格,并相互交融影响来创立独立的视觉体验.如果给定两张图像,现在 ...
- python 工具 图片批量合并
注:代码两处设置 region = (4,3,x-3,y-5) 目的是crop剪去图片的白边,这个可以视情况改变 图片需要命名为 x_1.png .....这样的格式 #encoding=ut ...
- 用Visual C++ 2010 载入动态链接库三部曲(使用第三方库的一般方法)
以下以载入编译好的ACE动态链接库为例说明:这里如果你已经设置了环境变量ACE_ROOT ACE在VS2010下高速配置载入动态链接库三部曲:(这里如果你的ACE文件夹为E:\ACE_wrappers ...
- HAProxy简单使用
一.HAProxy简介及定位 HAProxy 是一款基于TCP和HTTP应用的具备高可用行且负载均衡的代理软件.HAProxy是完全免费的,借助HAProxy可以快速.可靠地提供基于T ...
- 可在 html5 游戏中使用的 js 工具库
可在 html5 游戏中使用的 js 工具库 作者: 木頭 时间: September 21, 2014 分类: Utilities,Game 使用 cocos2d-js 3.0 开发游戏项目两三个月 ...
- mysql 修改表引擎方法
修改表引擎方法 方法1:修改mysql.ini配置文件,重启mysql服务生效 修改my.ini,在[mysqld]下加上default-storage-engine=INNODB 其中红色字体部分是 ...
- Matlab princomp函数浅析
matlab中的princomp函数主要是实现主成分分析的功能,有1一个输入参数,4个返回参数,形式如下: [coef, score, latent, t2] = princomp(X) 输入: X为 ...
- 轻松搞定RabbitMQ(一)——RabbitMQ基础知识+HelloWorld
转自 http://blog.csdn.net/xiaoxian8023/article/details/48679609 本文是简单介绍一下RabbitMQ,参考官网上的教程.同时加入了一些自己的理 ...
- Android------Intent.createChooser
Intent的匹配过程中有三个步骤,包含Action , category与data 的匹配. 假设匹配出了多个结果.系统会显示一个dialog让用户来选 择.例如以下图: 那么今天我们主要是解 ...
- JavaScript语言基础9
我们先看看以下这段代码: <span style="font-size:18px;"><HTML> <HEAD> <TITLE>He ...