WinDbg 调试工具的使用
来源:互联网 发布:电力系统分析软件bpa 编辑:程序博客网 时间:2024/05/13 22:43
转自:http://www.cnblogs.com/springyangwc/archive/2011/11/15/2249887.html
概述
项目接近尾声了,可是在运行时会有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.功劳很大.
- WinDbg 调试工具的使用
- WinDbg 调试工具的使用
- WinDbg 调试工具的使用(内存泄露)
- 初试 windbg. 强大的调试工具.
- 使用WinDBG调试内存泄露的问题
- 使用WinDbg调试程序
- 使用WinDbg调试程序
- 使用WinDbg调试程序
- 使用WinDbg调试程序
- 使用WinDbg调试程序
- 使用windbg调试程序
- 使用WinDbg调试程序
- 使用WinDbg调试程序
- 使用WinDbg调试程序
- 使用Windbg调试内核
- 使用WinDbg调试程序
- 使用Windbg调试内核
- 使用WinDbg内核调试
- uva699The Falling Leaves 入门经典II 第六章数据结构基础 例题6-10
- 2014 华为校招机试题(c/c++开发类)
- sql CHARINDEX,REPLACE函数使用
- BZOJ 2134 单选错位 期望DP
- Quick-Cocos2d-x 集成 Google protobuf 方法
- WinDbg 调试工具的使用
- 的法师打发打发士大夫
- 读《心外传奇》
- LA 4426 Blast the Enemy!
- 常见的网站服务器架构
- JQuery日历插件My97DatePicker日期范围限制
- mysql主从复制实战
- 后的覆盖蝴蝶飞过后冯国华
- 的分公司的分公司的覆盖是覆盖