内存泄漏排查
一下本人只是简单的介绍一个实用, 如果读者很感兴趣, 可以查阅msdn自己去深入调查相关的API和原理.
API 介绍
1. 马上打印泄漏信息:_CrtDumpMemoryLeaks();
一般用于局部跟踪内存泄漏问题,使用的方法很简单,你怀疑在某一个时刻有内存泄漏了,就执行这个函数调用,然后在 vs 调试器的 "output" 窗口会马上会打印出当前所有没有释放的内存的申请明细(包括文件名,行号, 第几次内存分配)。
双击就可以定位到源文件 内存申请的地方, 很方便.
2. 程序结束之前打印泄漏信息:
一般用于全局的内存泄漏问题,在程序刚开始的时候就可以用起来。
使用方法也很简单,执行下面两个语句, 先初始化, 然后设置在第几次的内存分配停住.
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
_CrtSetBreakAlloc(long); // 设置在第几次内存分配的时候程序暂停执行,并回复现场
环境的设置
1. 每一个MFC生成的类都会有下面的语句
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define DEBUG_NEW new(THIS_FILE, __LINE__) 
#define new DEBUG_NEW
#endif
有了这些定义打印泄漏信息的时候就能准备的定位到文件名和行号,双击就能定位过去。
2. 非MFC也可以利用现有的VC库来实现这个功能,同样是在new上面花功夫,如下:
#ifdef _DEBUG
#define new   new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
有了这几行代码,功能上面和MFC就一样了。
3. 获得具体导致内存泄漏的那一份内存分配操作的现场。
获得的静态信息里面,在文件名和行号后面还有一个数字,就是代表具体第几次内存分配 (这里是197)。
所以,我们调用_CrtSetBreakAlloc(197);程序就会在这一次内存分配的时候停下来,这样我们就获得了现场。
Detected memory leaks!
Dumping objects ->
d:\src-project\basictest - 副本\basictest\main.cpp(48) : {197} normal block at 0x002D9488, 128 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete.
样例代码:
  1. #ifdef _DEBUG
  2. #define new new(_NORMAL_BLOCK, __FILE__, __LINE__) // 方便调试输出文件行号信息
  3. #endif
  4. void MemoryTest() {
  5. _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); // 全局设置, 程序退出的时候可以看见内存泄漏.
  6. _CrtSetBreakAlloc(55); // 第55次内存分配的时候停止.
  7. int *p = new int(10); // 分配内存
  8. _CrtDumpMemoryLeaks(); // 检查当前有哪些内存没有释放.
  9. }

from:http://blog.chinaunix.net/uid-22283027-id-3404621.html

windows 下面的内存泄漏排查.的更多相关文章

  1. Chrome JS内存泄漏排查方法(Chrome Profiles)

     原文网址:http://blog.csdn.net/kaitiren/article/details/19974269 JS内存泄漏排查方法(Chrome Profiles)   Google Ch ...

  2. 填坑总结:python内存泄漏排查小技巧

    摘要:最近服务遇到了内存泄漏问题,运维同学紧急呼叫解决,于是在解决问题之余也系统记录了下内存泄漏问题的常见解决思路. 本文分享自华为云社区<python内存泄漏排查小技巧>,作者:luti ...

  3. JS内存泄漏排查方法——Chrome Profiles

    一.概述 Google Chrome浏览器提供了非常强大的JS调试工具,Heap Profiling便是其中一个.Heap Profiling可以记录当前的堆内存(heap)快照,并生成对象的描述文件 ...

  4. Spring Boot引起的“堆外内存泄漏”排查及经验总结

    小结: 检索词:C++内存分配器.jvm内存模型.gdb.内存泄露 https://tech.meituan.com/2019/01/03/spring-boot-native-memory-leak ...

  5. Windows 下的内存泄漏检测方法

    在 Windows 下,可使用 Visual C++ 的 C Runtime Library(CRT) 检测内存泄漏. 首先,我们在.c或.cpp 文件首行插入这一段代码: #define _CRTD ...

  6. JS内存泄漏排查方法-Chrome Profiles

    原文链接:http://caibaojian.com/chrome-profiles.html 一.概述 Google Chrome浏览器提供了非常强大的JS调试工具,Heap Profiling便是 ...

  7. [转]JS内存泄漏排查方法(Chrome Profiles)

    Google Chrome浏览器提供了非常强大的JS调试工具,Heap Profiling便是其中一个.Heap Profiling可以记录当前的堆内存(heap)快照,并生成对象的描述文件,该描述文 ...

  8. 【转载】Spring Boot引起的“堆外内存泄漏”排查及经验总结

    背景 为了更好地实现对项目的管理,我们将组内一个项目迁移到MDP框架(基于Spring Boot),随后我们就发现系统会频繁报出Swap区域使用量过高的异常.笔者被叫去帮忙查看原因,发现配置了4G堆内 ...

  9. 内存泄漏排查之:Show me your Memory

    java 语言有个神奇的地方,那就是你时不时会去关注下内存.(当然了,任何牛逼的同学都应该关注内存) 今天我们就来这么场景吧:某应用运行了一段时间后,ecs监控报警了,内存比较高了,怎么办?随着时间的 ...

随机推荐

  1. 关于scala环境配置详解

    首先从官网下载适合自身电脑配置的scala安装包.scala下载官网网址:http://www.scala-lang.org/download/ 同时scala还有自己集成好的IDE,例如eclips ...

  2. 复习-C语言内嵌汇编-初级(2)

    汇编取出内存中的值 # include <stdio.h> int main() { ; ; int *p = &i; //ret = *p; __asm__( "ldr ...

  3. 宏定义&CodeBlocks&Glib

    一.gcc的参数中-Dmacro             等价于代码里   #define macro -Dmacro=value  等价于代码里   #define macro value -Uma ...

  4. Java 拾遗

    1.选择表达式中的类型转换 public class Test { public void static main(String args[]){ int i = 5; System.out.prin ...

  5. 16.java.lang.InterruptedException

    java.lang.InterruptedException 被中止异常 当某个线程处于长时间的等待.休眠或其他暂停状态,而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常 ...

  6. HTTP协议漫谈

    简介 园子里已经有不少介绍HTTP的的好文章.对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲解. HTTP的定义和 ...

  7. java 操作配置文件 .properties

    package com.dms.common; import java.io.File; import java.io.FileInputStream; import java.io.FileNotF ...

  8. java 中解决中文乱码问题的方法(三法)

    1. 重新定义. String str = "中文试试" ; str = new String(u.getBytes("iso-8859-1"),"u ...

  9. ADO.NET FOR MySQL帮助类

    using System; using System.Collections; using System.Collections.Specialized; using System.Data; usi ...

  10. 散列表的实现 -- 数据结构与算法的javascript描述 第八章

    散列表(哈希表 散列是一种常用的数据存储技术,散列后的数据可以快速地插入或取用. 散列表需要一个散列值(key)来存储指定数据,取数据也是依靠此. 散列值可以依靠计算数据的 ASCII码来获得,但是这 ...