linux平台代码内存泄露检查

linux内存泄露检测

// file        : demo.cpp
// description : show the memmory leak detection
int main()
{
    int* a = new int[10];  // 1, new and not delete 
    a[10] = 1;             // 2, array over range
}

cppcheck 静态检查

可以选择 vscode 安装 cppcheck 插件

zhanghl@zhanghl-Inspiron-7460:~/workspace/env/05_valgrind$ cppcheck demo.cpp 
Checking demo.cpp...
[demo.cpp:41]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.
[demo.cpp:45]: (error) Memory leak: a

ps. 不能检测太复杂的代码,检测如下 mtrace 的代码, mtrace 等系统调用会干扰检查结果

mtrace

需要在代码中添加mtrace()来检查堆的一致性,另外需要设置环境变量MALLOC_TRACE

#include <cstdlib>         // setenv
#include <cstring>         // strerror
#include <string>
#include <errno.h>         // errno
#include <mcheck.h>
#include <iostream>
int main()
{
    using std::string;
    using std::cerr;
    using std::endl;

    const string mtraceFl( "mtrace_outfile" );    
    if( -1 == setenv( "MALLOC_TRACE", mtraceFl.c_str(), 1 ) )
        cerr << "Error: set mtrace env( " << strerror( errno ) <<  " )" << endl;
    mtrace();

    int* a = new int[10]; 
    a[10] = 1;   
    muntrace();
}

编译时加入调试选项-g和链接库-mcheck,调用完成调用mtrace分析输出的数据文件

zhanghl@zhanghl-Inspiron-7460:~/workspace/env/05_valgrind$ g++ -g -o demo demo.cpp -lmcheck
zhanghl@zhanghl-Inspiron-7460:~/workspace/env/05_valgrind$ ./demo 
zhanghl@zhanghl-Inspiron-7460:~/workspace/env/05_valgrind$ mtrace mtrace_outfile 

Memory not freed:
-----------------
           Address     Size     Caller
0x0000000000698460     0x28  at 0x7fdd0281ce78

ps. 不能检测检查到内存非法访问

valgrind

可以检查出非法访问,但是mtrace同样会被认定为内存泄露

zhanghl@zhanghl-Inspiron-7460:~/workspace/env/05_valgrind$ valgrind ./demo 
==22941== Memcheck, a memory error detector
==22941== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==22941== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==22941== Command: ./demo
==22941== 
==22941== Invalid write of size 4                                            // 1, 内存非法访问,可以定位到代码
==22941==    at 0x400F03: main (demo.cpp:38)
==22941==  Address 0x5ab74a8 is 0 bytes after a block of size 40 alloc'd
==22941==    at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==22941==    by 0x400EF6: main (demo.cpp:25)
==22941== 
==22941== 
==22941== HEAP SUMMARY:
==22941==     in use at exit: 73,256 bytes in 3 blocks
==22941==   total heap usage: 7 allocs, 4 frees, 74,452 bytes allocated
==22941== 
==22941== LEAK SUMMARY:
==22941==    definitely lost: 552 bytes in 2 blocks                   // 2块内存泄露,其中一块是 mtrace() 引入的
==22941==    indirectly lost: 0 bytes in 0 blocks
==22941==      possibly lost: 0 bytes in 0 blocks
==22941==    still reachable: 72,704 bytes in 1 blocks                // 3, still rechable 没有关系
==22941==         suppressed: 0 bytes in 0 blocks
==22941== Rerun with --leak-check=full to see details of leaked memory
==22941== 
==22941== For counts of detected and suppressed errors, rerun with: -v
==22941== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

查看详细信息,--leak-check=full -v

...
==23742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 3
==23742==    at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==23742==    by 0x400EF6: main (demo.cpp:25)
==23742== 
==23742== 512 bytes in 1 blocks are definitely lost in loss record 2 of 3
==23742==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==23742==    by 0x545AF57: mtrace (mtrace.c:296)
==23742==    by 0x400EEC: main (demo.cpp:23)
...
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容