4-Linux 内存泄漏工具

1、mtrace

应用环境:Linux GLIBC

编程语言:C

使用方法: 包含头文件mcheck.h,定义环境变量MALLOC_TRACE为输出文件名,程序开始时调用mtrace()即可。

结果输出:用户指定的文件

设计思路: 为malloc,realloc,free函数添加钩子函数,记录每一对malloc-free的执行

优缺点:只能检查使用malloc/realloc/free造成的的内存泄露

如何获取:GLIBC自带,可直接使用

2、memwatch

应用环境:Linux

编程语言:C

使用方法: 加入memwatch.h,编译时加上-DMEMWATCH -DMW_STDIO及memwatch.c

结果输出:输出文件名称为memwatch.log,在程序执行期间,错误提示都会显示在stdout上

设计思路:将malloc/realloc/calloc/strdup/free等重定义为mwMalloc(sz, FILE, LINE)等,内部维护一个操作链表

在memwatch.h里面重定义了

#define malloc(n)       mwMalloc(n,__FILE__,__LINE__)
#define strdup(p)       mwStrdup(p,__FILE__,__LINE__)
#define realloc(p,n)    mwRealloc(p,n,__FILE__,__LINE__)
#define calloc(n,m)     mwCalloc(n,m,__FILE__,__LINE__)
#define free(p)         mwFree(p,__FILE__,__LINE__)
#define CHECK()         mwTest(__FILE__,__LINE__,MW_TEST_ALL)
#define CHECK_THIS(n)   mwTest(__FILE__,__LINE__,n)
#define CHECK_BUFFER(b) mwTestBuffer(__FILE__,__LINE__,b)
#define MARK(p)         mwMark(p,#p,__FILE__,__LINE__)
#define UNMARK(p)       mwUnmark(p,__FILE__,__LINE__)

优缺点:能检测双重释放(double-free)、错误释放(erroneous free)、内存泄漏(unfreed memory)、溢出(Overflow)、下溢(Underflow)等等

如何获取:http://memwatch.sourceforge.net/

官方下载代码后,把memwatch.c和memwatch.h弄到想要的工程里面

编译的CFLAGS加上-DMEMWATCH -DMW_STDIO

ZSCREEN_CFLAGS  = $(CFLAGS) -fPIC -Wall -Werror -std=gnu99 -Os -DMEMWATCH -DMW_STDIO

注意:要在所有的.c里面都添加#include “memwatch.h”,不然会出现问题。可以添加在util.h里面,其他人再包含util.h

所以如果是其他库里面使用的malloc,这时候没办法在库里面添加memwatch.h头进行替换,就会出现类似WILD free的错误提示

main开始的时候调用 mwInit(),结束的时候调用mwTerm()

#include "memwatch.h"

int main(int argc, char **argv)
{
	char *p;

	mwInit();
	
	p = malloc(210);
    free(p);
	p = strdup("121232");

	mwTerm();
	return 0;
}

运行停止后,在本地就会生成一个memwatch.log文件,提示第几行出现了内存为释放多少字节。

============= MEMWATCH 2.71 Copyright (C) 1992-1999 Johan Lindh =============
                                                 
Started at Tue Oct 27 09:24:00 2020                                             
                                                                                
Modes: __STDC__ 64-bit mwDWORD==(unsigned long)                                 
mwROUNDALLOC==8 sizeof(mwData)==32 mwDataSize==32                               
                                                                                
                                                                                
Stopped at Tue Oct 27 09:24:02 2020                                             
                                                                                
unfreed: <3> zscreen.c(58), 7 bytes at 0xb510a8         {31 32 31 32 33 32 00 ..
                                 
Memory usage statistics (global):
 N)umber of allocations made: 2  
 L)argest memory usage      : 210
 T)otal of all alloc() calls: 217                                            
 U)nfreed bytes totals      : 7

3、valgrind

应用环境:Linux

编程语言:C/C++

使用方法: 编译时加上-g选项,如 gcc -g filename.c -o filename,使用如下命令检测内存使用情况:

结果输出:#valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./filename,就会看到内存使用报告

设计思路:根据软件的内存操作维护一个有效地址空间表和无效地址空间表(进程的地址空间)

优缺点:能够检测:

使用未初始化的内存 (Use of uninitialised memory)

使用已经释放了的内存 (Reading/writing memory after it has been free’d)

使用超过 malloc分配的内存空间(Reading/writing off the end of malloc’d blocks)

对堆栈的非法访问 (Reading/writing inappropriate areas on the stack)

申请的空间是否有释放 (Memory leaks – where pointers to malloc’d blocks are lost forever)
malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])
src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions)
重复free

如何获取:http://valgrind.org/

4、debug_new

应用环境:Linux/Windows

编程语言:C++

使用方法: 包含头文件debug_new.h,链接debug_new.cpp

结果输出:控制台console

设计思路: 通过重载new和delete操作符来捕获内存申请/释放请求,并在程序内部维护一个全局静态变量的哈希链表。在new操作符中,不仅仅分配用户所要求的内存,而是在为每次分配的内存都添加一个头部,存储着此次分配的位置信息和链表指针,new返回的是分配的这块内存加上头部偏移后的值,而在之前已经将此返回值作了HASH计算并添加到HASH链表中了。delete的时候先根据要释放的指针地址做HASH计算,然后再遍历数组HASH值处的链表进行查找,如果找到则将该节点移除,未找到就abort。这样在程序结束之后,通过检查此数组中是否还有未释放的内存块来确定是否有内存泄露。

优缺点:跨平台,仅用于C++程序,

如何获取:http://www.ibm.com/developerworks/cn/linux/l-mleak2/index.html

https://www.cnblogs.com/guochaoxxl/p/6970090.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值