zoukankan      html  css  js  c++  java
  • windows 下面的内存泄漏排查.

    内存泄漏排查
    一下本人只是简单的介绍一个实用, 如果读者很感兴趣, 可以查阅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-projectasictest - 副本asictestmain.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
  • 相关阅读:
    kubernetes实战(十六):k8s高可用集群平滑升级 v1.11.x 到v1.12.x
    kubernetes实战(十四):k8s持久化部署gitlab集成openLDAP登录
    kubernetes实战(十三):k8s使用helm持久化部署harbor集成openLDAP登录
    kubernetes实战(十二):k8s使用helm持久化部署redmine集成openLDAP
    kubernetes实战(十一):k8s使用openLDAP统一认证
    Django数据库连接Mysql配置
    HmailServer 无法发信 端口25连接失败 ConnectFail not possible to connect 请看这里
    C++ Opencv安装教程 超详细图解 Vs2015/2017/2019(C++)绑定 VisualStduio
    Python Ftp Ftplib dir()方法 返回值问题
    Collections 初识
  • 原文地址:https://www.cnblogs.com/lidabo/p/3434026.html
Copyright © 2011-2022 走看看