您的位置:威尼斯官方网站 > 威尼斯官方网站 > 可以用来验证Memcheck是否有误报

可以用来验证Memcheck是否有误报

发布时间:2020-01-02 18:07编辑:威尼斯官方网站浏览(128)

    引用原版的书文地址

     

    1. 在program中严格按下边顺序include

      1 #define _CRTDBG_MAP_ALLOC
      2 #include <stdlib.h>
      3 #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:usersusernamedocumentsprojectsleaktestleaktest.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:codesvs2010testdetectmemleakconsoletest.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的行号

    本文由威尼斯官方网站发布于威尼斯官方网站,转载请注明出处:可以用来验证Memcheck是否有误报

    关键词:

上一篇:axios的介绍就不用了吧

下一篇:没有了