用CRT查找内存泄漏
引用原文地址 :
https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx
1. 在program中严格按下面顺序include
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
2. 必须是Debug版的build
Q : LiteServer遍Debug可能会遇到一些问题
A : 可以用来验证Memcheck是否有误报。
可以在对应的地址处下断点(会频繁断在malloc上,需要根据size下条件断点)
Q : code在Release和Debug版下可能会不一样,最后可能会出现一个有memory leak一个没有
3. "#define _CRTDBG_MAP_ALLOC"这个宏不能省略,否则memory leak的dump会缺少一些细节(如leak的code位置信息)
4. 在app exit前,可以调用这个function打印memory leak report
_CrtDumpMemoryLeaks();
Q : 如果是全局或静态obj,在exit前其还未释放,此时report不会造成误报吗?
A :不会
5. 如果app有多个exits,你是不需要call _CrtDumpMemoryLeaks()在每个exit位置的。在app开始的位置call下面这个_CrtSetDbgFlag(),其会自动在每个exit的位置自动call _CrtDumpMemoryLeaks()
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
6. 默认情况下,memory leak的report会在VS Studio Debug窗的Output窗口中,可以用_CrtSetReportMode()将其重定向到其他位置。
7. Report格式
Detected memory leaks!
Dumping objects ->
c:\users\username\documents\projects\leaktest\leaktest.cpp(20) : {18} //{18} : memory分配序号
normal block at 0x00780E80, 64 bytes long. //64 bytes : block的大小(并不是分配时指定的大小,因为分配的heap由于会添加堆头堆尾等额外信息,会比分配时指定的size要大)
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Q : 发现即使按照第一条中的定义,也不会输出memory leak的行信息。
A : 这个crtdbg对new处理不好,其block的地址只会new调用macro的地址,可用如下宏DBG_NEW来替代new,以打印出对应的行信息
#ifdef _DEBUG
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
// Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the
// allocations to be of _CLIENT_BLOCK type
#else
#define DBG_NEW new
#endif
Q : 需要替换所有的源码,而且第三方库怎么办?
Q : 没有栈回溯信息,多层调用怎么查找源头信息?
A : Debug,在app入口断下后,在watch窗口输入"_crtBreakAlloc"(如果"Runtime Library"是"/MD",则还需要添加"{,,ucrtbased.dll}_crtBreakAlloc"),这个值应该是"-1",修改成detect到的memory leak的分配序号(如7中的{18}),当分配该大小的memory时就会断下来(注意,重跑后的条件要和第一次获取分配序号的一致)。
另外,在code中也可以直接指定:
_crtBreakAlloc = 18;
or :
_CrtSetBreakAlloc(18);
8. Test
1> code
#include <memory> std ::tr1 ::shared_ptr <int > sp_nTest; void Test ()
{
sp_nTest. reset( new int( 0x88)); //memory leak
int* pnTest = new int( 0xCC); void* pMalloc = malloc( sizeof( int));
}
2> result
Detected memory leaks!
Dumping objects ->
d:\codes\vs2010\test\detectmemleak\console\test.cpp(14) : {65} normal block at 0x007B18A8, 4 bytes long.
Data: < > CD CD CD CD
{64} normal block at 0x007B4F90, 4 bytes long.
Data: < > CC 00 00 00 Object dump complete.
红色部分是new出来的memory leak,可见并不会报出对应的code的行号
用CRT查找内存泄漏的更多相关文章
- 利用Java剖析工具JProfiler查找内存泄漏的方法
本文主要介绍如何如何利用在使用JProfiler时意识到内存泄漏以及查找内存泄漏的几种方法. 工具/原料 JProfiler 方法/步骤 JProfiler的内存视图会话提供了内存使用情况的动 ...
- 使用CRT定位内存泄漏
1. 使能内存泄漏检测#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>注1:语句顺序不能修改:注2 ...
- java命令--jmap命令使用(查找内存泄漏对象)
转自:https://www.cnblogs.com/kongzhongqijing/articles/3621163.html jdk安装后会自带一些小工具,jmap命令(Java Memory M ...
- 【转】使用UMDH查找内存泄漏
转载出处:http://blog.csdn.net/phiger/article/details/1932141 Umdh 是 Debugging Tools for Windows 里面的一个工具, ...
- C++中基于Crt的内存泄漏检测(重载new和delete,记录在Map里)
尽管这个概念已经让人说滥了 ,还是想简单记录一下, 以备以后查询. #ifdef _DEBUG#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FIL ...
- Linux 下用 valgrind 查找内存泄漏小例子
1.安装 valgrind yum install valgrind 2.测试用例 main.cpp #include <iostream> using namespace std; st ...
- 教程:查找内存泄漏 (JavaScript)
本主题带领您完成使用 JavaScript 内存分析器确定并修复简单内存问题的过程.在本教程中,我们创建一个生成大量数据的应用程序.我们预期在导航到新页时该应用程序会释放数据. 说明 JavaScr ...
- Windows下使用Gflags和UMDH查找内存泄漏
GFlags和UMDH与WinDbg一样,都是Debugging Tools for Windows里的工具. 1.设置符号路径 去微软官网下载对应的操作系统的符号安装文件,并安装到某个目录,如C:\ ...
- Xcode查找内存泄漏
随机推荐
- Access-Control-Allow-Origin与Ajax跨域
问题 在某域名下使用Ajax向另一个域名下的页面请求数据,会遇到跨域问题.另一个域名必须在response中添加 Access-Control-Allow-Origin 的header,才能让前者成功 ...
- [ACdream]女神教你字符串——违和感
题目描述: 女神最喜欢字符串了,字符串神马的最有爱了. 女神是一个重度强迫症患者,面对不是对称的东西,她会觉得太违和了,就会爆炸.所以她手上的字符串都是回文的,像什么a,b,aabaa,abcba,上 ...
- 前端页面中如何在窗口缩放时让两个div始终在同一行显示
直接贴代码吧 先总结一下吧 有两种方法 一 最外层设置一个大div 给这个大div固定的宽度和高度 给里面两个小div 设置浮动 设置宽高 <!DOCTYPE html> &l ...
- Linux系统查找
1. which:在当前用户环境变量path指定的路径下查找可执行程序/文件. 特点:(1)只在当前用户环境变量指定的路径下查找: (2)只找出可执行程序/文件的位置: (3)查找速度非常快. 注:使 ...
- 初识Http协议抓包工具—Fiddler
1.Fiddler简介 Fiddler是用一款使用C#编写的http协议调试代理工具.它支持众多的http调试任务,能够记录并检查所有你的电脑和互联网之间的http通讯,可以设置断点,查看所有的“进出 ...
- java时间格式
Calendar startdate = Calendar.getInstance(); startdate.setTime(new Date()); //当前时间 startdate.add(Cal ...
- iOS 之GCD串行和并发队列的理解
dispatch_queue_t serialQueue = dispatch_queue_create("com.lai.www", DISPATCH_QUEUE_SERIAL) ...
- 项目swift的一些问题
在用swift做项目的时候,总会把之前oc的思想转过来. 1. 对Alamofire的再次封装,之前使用AFNetwork进行了在次封装,这样做的好处就是可以用一个全局的类来管理全部的网络请求,这样就 ...
- 使用css3实现瀑布流布局效果
使用CSS3可以轻松实现瀑布流布局,但这种方法有个缺点,就是对于商城类型的网站,价格筛选时,并不能达到理想效果. 1.column-count 把div中的文本分为多少列 2.column-width ...
- 网络基础二 tcp/ip协议簇 端口 三次握手 四次挥手 11种状态集
第1章 概念介绍 1.1 VLAN 1.1.1 什么是VLAN VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成 ...