用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查找内存泄漏
随机推荐
- C# 多线程、异步线程、线程池相关知识
/* 线程池ThreadPool类会在需要时增减池中线程的线程数,直到最大的线程数.池中的最大线程数是可配置的. 在双核CPU中,默认设置为1023个工作线程和1000个I/O线程.也可以指定在创建线 ...
- zookeeper curator使用caches实现各种监听
1.篇首语 curator是zookeeper的一个高级api开发包.封装了zookeeper众多的recipes,并且实现了一些新的recipes原语,最重要的是基于zookeeper提供的各种机制 ...
- Android使用RxJava+Retrofit2+Okhttp+MVP练习的APP
Android使用RxJava+Retrofit2+Okhttp+MVP练习的APP 项目截图 这是我的目录结构 五步使用RxJava+Retrofit2+Okhttp+RxCache 第一步 ...
- exp3.1实现顺序栈的各种操作
#include<iostream>using namespace std;#include<malloc.h>typedef char Elem;typedef struct ...
- Appium python自动化测试系列之Android知识讲解(三)
3.1 ADB工具讲解 3.1.1 什么是ADB呢? 我们不去解释官方语言的翻译,给大家说一个通熟易懂的说法,ADB我理解为他就是电脑和手机连接的桥梁.此连接不是充电的连接,大家不要混淆,说他是一个 ...
- win10 输入法禁用IME
发现了win10 没法输入,因为禁用IME 右击开始 计算机管理 任务计划程序 打开到Microsoft/Windows/TextServicesFramework 选择操作运行 选择如果任务失 ...
- (10.20)Java小作业!
今天想要和大家分享一道我最近遇到的题,里面既包括了嵌套循环的运用,还有函数的定义与调用,我个人觉得挺有价值的. 打印一个由*号构成的等腰三角形: 具体的解题方法如下: public class get ...
- [解读REST] 6.REST的应用经验以及教训
衔接上文[解读REST] 5.Web的需求 & 推导REST,上文根据Web的需求推导出了REST架构风格,以及REST的详细描述和解释.自从1994年以来,REST架构风格被用于指导Web架 ...
- Uva11582
最近各种破事忙死了 终于开始做题了 紫薯第10章第一题,come on 设g(i)=f(i) mod n,当二元组(g(i).g(i+1))出现重复时,整个序列就开始重复(这一话怎么也不懂,请大神解释 ...
- 【ASP.NET MVC 学习笔记】- 18 Bundle(捆绑)
本文参考:http://www.cnblogs.com/willick/p/3438272.html 1.捆绑(Bundle),一个在 View 和 Layout 中用于组织优化浏览器请求的 CSS ...