memleax是个开源项目,原理是通过注入hook目标进程的malloc(new也是用的malloc)内存分配函数,在指定时间未释放则认为内存泄漏。优点是不需要重启,attach到目标进程。

github地址:http://wubingzheng.github.io/memleax/

ubuntu编译需要安装 libunwind8-dev、libelf-dev 和 libdw-dev 3个库。

测试代码:

#include <iostream>
#include <unistd.h>
#include <fstream> using namespace std; int main()
{
while ()
{
cout << "Hello world" << endl;
cout << "Hello world" << endl;
cout << "Hello world" << endl;
cout << "Hello world" << endl;
cout << "Hello world" << endl; ofstream myfile;
myfile.open ("1.txt"); cout << "Hello world" << endl;
cout << "Hello world" << endl;
cout << "Hello world" << endl;
cout << "Hello world" << endl;
cout << "Hello world" << endl;
cout << "Hello world" << endl;
cout << "Hello world" << endl;
char *p = new char(); usleep( * );
}
}
$ sudo memleax -e  

== Begin monitoring process ...
CallStack[]: memory expires with bytes, backtrace:
0x00007f07e2a8e4a0 libc-2.21.so __libc_malloc()+ /build/buildd/glibc-2.21/libio/genops.c:
0x00007f07e2a7911d libc-2.21.so ?() /build/buildd/glibc-2.21/libio/iofopen.c:
0x00007f07e3067120 libstdc++.so _ZNSt12__basic_fileIcE4openEPKcSt13_Ios_Openmo()+
0x00007f07e30a918a libstdc++.so _ZNSt13basic_filebufIcSt11char_traitsIcEE4open()+
0x00007f07e30a93e0 libstdc++.so _ZNSt14basic_ofstreamIcSt11char_traitsIcEE4ope()+
0x0000000000400c31 cppleak main()+ /home/kiiim/aosp/memleak_test/.cpp:
CallStack[]: memory expires with bytes, backtrace:
0x00007f07e2a8e4a0 libc-2.21.so __libc_malloc()+ /build/buildd/glibc-2.21/libio/genops.c:
0x00007f07e3049698 libstdc++.so _Znwm()+
0x00007f07e3049749 libstdc++.so _Znam()+
0x00007f07e30a9231 libstdc++.so _ZNSt13basic_filebufIcSt11char_traitsIcEE4open()+
0x00007f07e30a93e0 libstdc++.so _ZNSt14basic_ofstreamIcSt11char_traitsIcEE4ope()+
0x0000000000400c31 cppleak main()+ /home/kiiim/aosp/memleak_test/.cpp:
CallStack[]: memory expires with bytes, backtrace:
0x00007f07e2a8e4a0 libc-2.21.so __libc_malloc()+ /build/buildd/glibc-2.21/libio/genops.c:
0x00007f07e3049698 libstdc++.so _Znwm()+
0x0000000000400cff cppleak main()+ /home/kiiim/aosp/memleak_test/.cpp:
CallStack[]: expired-memory frees after seconds
CallStack[]: expired-memory frees after seconds
CallStack[]: memory expires with bytes, times again
CallStack[]: memory expires with bytes, times again
CallStack[]: memory expires with bytes, times again
CallStack[]: expired-memory frees after seconds
CallStack[]: expired-memory frees after seconds
CallStack[]: memory expires with bytes, times again
CallStack[]: memory expires with bytes, times again
CallStack[]: memory expires with bytes, times again
CallStack[]: expired-memory frees after seconds
Warning: too many expired-free at CallStack[]. will not show this CallStack later
CallStack[]: expired-memory frees after seconds
Warning: too many expired-free at CallStack[]. will not show this CallStack later
CallStack[]: memory expires with bytes, times again
CallStack[]: memory expires with bytes, times again
CallStack[]: memory expires with bytes, times again
CallStack[]: memory expires with bytes, times again
CallStack[]: memory expires with bytes, times again
CallStack[]: memory expires with bytes, times again
CallStack[]: memory expires with bytes, backtrace:
0x00007f07e2a8e4a0 libc-2.21.so __libc_malloc()+ /build/buildd/glibc-2.21/libio/genops.c:
0x00007f07e3049698 libstdc++.so _Znwm()+
0x0000000000400cff cppleak main()+ /home/kiiim/aosp/memleak_test/.cpp:

标志 char *p = new char(100); 的内存泄漏。

CallStack[2]: memory expires with 8192 bytes, 3 times again

CallStack[2]:expired-memory frees after 3 seconds Warning: too many expired-free at CallStack[2]. will not show this CallStack later

文件句柄因为在while结束时会释放,程序很人性化。屏蔽了这个告警。

C/C++内存泄漏检测 —— memleax的更多相关文章

  1. C++程序内存泄漏检测方法

    一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在W ...

  2. 利用Android Studio、MAT对Android进行内存泄漏检测

    利用Android Studio.MAT对Android进行内存泄漏检测 Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的c ...

  3. VS2005内存泄漏检测方法[转载]

    一.非MFC程序可以用以下方法检测内存泄露: 1. 程序开始包含如下定义: #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __ ...

  4. 【转】简单内存泄漏检测方法 解决 Detected memory leaks! 问题

    我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} n ...

  5. Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector

    那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能,我们可以使用第三方工具Visual Leak Detector(以下简 ...

  6. _CrtSetBreakAlloc简单内存泄漏检测方法,解决Detected memory leaks!问题

    我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} n ...

  7. Android内存泄漏检测利器:LeakCanary

    Android内存泄漏检测利器:LeakCanary MAR 28TH, 2016 是什么? 一言以蔽之:LeakCanary是一个傻瓜化并且可视化的内存泄露分析工具 为什么需要LeakCanary? ...

  8. Windows平台下的内存泄漏检测

    在C/C++中内存泄漏是一个不可避免的问题,很多新手甚至有许多老手也会犯这样的错误,下面说明一下在windows平台下如何检测内存泄漏. 在windows平台下内存泄漏检测的原理大致如下. 1. 在分 ...

  9. C++内存泄漏检测工具

    C++内存泄漏检测工具 1.VC自带的CRT:_CrtCheckMemory   调试器和 CRT 调试堆函数 1.1用法: /************************************ ...

随机推荐

  1. IDEA 自动生成 serialVersionUID 的设置

    打开File菜单,选择Settings选项,打开Settings设置对话框:左边树形目录,打开Editor>Inspections

  2. [contest 781] 9.6

    [contest 781] 9.6 - XJOI czx的温暖题... T1 军训

  3. 从线程模型的角度看Netty的高性能

    转载:Netty(二) 从线程模型的角度看 Netty 为什么是高性能的? 传统 IO 在 Netty 以及 NIO 出现之前,我们写 IO 应用其实用的都是用 java.io.* 下所提供的包. 比 ...

  4. SpringBoot的日志

    1.日志框架小张:开发一个大型系统:1.System.out.pringtln("");将关键数据打印在控制台:去掉?写在一个文件?2.框架来记录系统的一些运行信息:日志:zhan ...

  5. Win10系列:JavaScript 项目模板和项模板

    使用Visual Studio 开发Windows应用商店应用时,通过其提供的模板可以帮助我们快速地创建一个应用.其中,在新建一个Windows应用商店应用程序项目时可以在项目模板中选择所需要的模板类 ...

  6. 尚学堂java 参考答案 第八章

    一.选择题 1.BD 解析:B:Integer是对象,所以默认的应该是null对象.D使用的是自动装箱 2.A 解析:String类的对象是final型,是不能修改的,concat()方法是生成一个新 ...

  7. JavaScript创建对象(三)——原型模式

    在JavaScript创建对象(二)——构造函数模式中提到,构造函数模式存在相同功能的函数定义多次的问题.本篇文章就来讨论一下该问题的解决方案——原型模式. 首先我们来看下什么是原型.我们在创建一个函 ...

  8. java串口编程

    报错:no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDrive java.lang.Unsatisfie ...

  9. redis:集群配置

    一.redis集群相关 1.概念:redis集群是通过数据分区提供可用性的,这样即使一部分节点失效也可以继续处理请求. 2.原理:集群使用数据分片实现,一个redis集群包括16384个哈希槽,数据库 ...

  10. Oracle exists 和not exists 用法详解

    有两个简单例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; ...