malloc钩子和内存泄漏工具mtrace、Valgrind

一:malloc钩子函数

static void* (* old_malloc_hook) (size_t,const void *);
static void (* old_free_hook)(void *,const void *);
static void my_init_hook(void);
static void* my_malloc_hook(size_t,const void*);
static void my_free_hook(void*,const void *);

static void my_init_hook(void)
{
    old_malloc_hook = __malloc_hook;
    old_free_hook = __free_hook;
    __malloc_hook = my_malloc_hook;
    __free_hook = my_free_hook;
}

static void* my_malloc_hook(size_t size,const void *caller)
{
    void *result;
    // print_trace();
    __malloc_hook = old_malloc_hook;
     result = malloc(size);
    old_malloc_hook = __malloc_hook;
    PHONE_DEBUG_PRINT("/[email protected]@@ %p + %p 0x%x/n",caller,result,(unsigned long int)size);
    __malloc_hook = my_malloc_hook;

return result;
}

static void my_free_hook(void *ptr,const void *caller)
{
    __free_hook = old_free_hook;
    free(ptr);
    old_free_hook = __free_hook;
    PHONE_DEBUG_PRINT("/[email protected]@@ %p - %p/n",caller,ptr);
    __free_hook = my_free_hook;
}

just need call my_init_hook() at the check point.

二:check memory leak

想要跟踪的时候用mtrace。

停止跟踪可以使用muntrace.

内存泄漏检查方法(for Linux) :

如果你更想读原始文档, 请参考glibc info的"Allocation Debugging"
一章 (执行info libc);
glibc提供了一个检查内存泄漏的方法, 前提是你的程序使用glibc的标准函数
分配内存(如malloc, alloc...):

1. 在需要内存泄漏检查的代码的开始调用void mtrace(void) (在mcheck.h中
? 有声明). mtrace为malloc等函数安装hook, 用于记录内存分配信息.
在需要内存泄漏检查的代码的结束调用void muntrace(void).
注意: 一般情况下不要调用muntrace, 而让程序自然结束. 因为可能有些
释放内存代码要到muntrace之后才运行.

2. 用debug模式编译被检查代码(-g或-ggdb)

3. 设置环境变量MALLOC_TRACE为一文件名, 这一文件将存有内存分配信息.

4. 运行被检查程序, 直至结束或muntrace被调用.

5. 用mtrace命令解析内存分配Log文件($MALLOC_TRACE)
(mtrace foo $MALLOC_TRACE, where foo is the executible name)
如果有内存泄漏, mtrace会输出分配泄漏
内存的代码位置,以及分配数量.

其他东西

1. 可以将mtrace, muntrace放入信号处理函数(USR1, USR2), 以动态地进行
内存泄漏检查控制.

2. mtrace是个perl代码, 如果你对符号地址与代码文本的转换感兴趣, 可以
读一下.

3. again, 尽量不要用muntrace()

1 #include <mcheck.h>
2
3 int main()
4 {
5 mtrace();
6 malloc(10);
7 malloc(16);
8 return 0;
9 }

$gcc -g a.c #记得编译带-g调试选项
$export MALLOC_TRACE=a.log
$./a.out
$unset MALLOC_TRACE #记得执行完后unset变量,否则可能运行其他命令可能覆盖log
$mtrace a.out a.log
Memory not freed:
-----------------
Address Size Caller
0x09b08378 0xa at /XXX/a.c:6
0x09b08388 0x10 at /XXX/a.c:7

可以看到,会显示未释放动态空间的代码具体位置.

时间: 2024-12-11 10:28:42

malloc钩子和内存泄漏工具mtrace、Valgrind的相关文章

linux实用技巧:检测内存泄漏工具Valgrind

1.Valgrind简介 1.在我们编写C/C++的时候,最常见的错误之一就是内存泄露,这样的问题其实跟程序员的编程习惯密不可分.如果你在申请内存空间之后能够马上在合适的位置释放内存.会极大程度的避免内存泄漏的情况.但是人非圣贤,孰能无过.有时候我们确实忘记释放内存而导致了比较严重的错误,所以这个时候我们需要借助valgrind这个工具来判断内存泄漏. Valgrind 是一款 Linux下(支持 x86.x86_64和ppc32)程序的内存调试工具,它可以对编译后的二进制程序进行内存使用监测(

VS2015 定位内存泄漏工具vld

介绍一款在vs2015开发环境定位内存泄漏工具:Visual Leak Detector ,具体的使用方法如下: 1.  安装vld-2.5-setup.exe (下载链接地址后面会给出),安装过程会出现以下界面,所以复选框均 选中. 图1 vld安装显示界面 2. 利用 vs2015新建一个控制台程序,代码如下图所示: 图2 示例代码片段 如图2所示,只要将vld头文件引入到工程即可.vld.路径以及vld动态库VS2015可自动找到,不需要指定路径. 程序运行的结果如图3所示: 原文地址:h

Valgrind 内存泄漏工具

Valgrind 是一款 Linux下(支持 x86.x86_64和ppc32)程序的内存调试工具,它可以对编译后的二进制程序进行内存使用监测(C语言中的malloc和free,以及C++中的new和delete),找出内存泄漏问题. Valgrind 中包含的 Memcheck 工具可以检查以下的程序错误: 使用未初始化的内存 (Use of uninitialised memory) 使用已经释放了的内存 (Reading/writing memory after it has been f

Linux下内存泄漏工具

原文链接:http://www.cnblogs.com/guochaoxxl/p/6970090.html 概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,这时就出现了内存泄漏.尽管优秀的编程实践可以确保最少的泄漏,但是根据经验,当使用大量的函数对相同的内存块进行处理时,很可能会出现内存泄漏. 内存泄露可以分为以下几类: 1. 常发

内存泄漏工具VLD1.0_要点分析

0X01 关闭FPO优化 // Frame pointer omission (FPO) optimization should be turned off for this // entire file. The release VLD libs don't include FPO debug information, so FPO // optimization will interfere with stack walking. #pragma optimize ("y", of

Visual Leak Detector内存泄漏工具

Visual Leak Detector我们常用的C/C++内存泄露检查工具,同样在VS编译工具下都能使用该工具.不过在不同的版本上,设置有所不同.Visual Studio 2010下工作良好需要2.2版本及以上.最新版本我们可以在Codeplex.com上面下载.下载链接:http://vld.codeplex.com/ 设置步骤: 1.打开连接,我们选择下载最新的稳定版本vld-2.3-setup.exe 2.运行vld-2.3-setup.exe,按提示完成安装,记住安装的路径,在这我将

安卓 内存 泄漏 工具 LeakCanary 使用

韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha [email protected] LeakCanary是Square开源了一个内存泄露自动探测神器 .这是项目的github仓库地址:https://github.com/square/leakcanary  .使用非常简单,在build.gradle中引入包依赖: dependencies { debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' rel

Linux C编程内存泄漏工具:memwatch的使用

1.首先你需要下载它,在http://www.linkdata.se/sourcecode/memwatch/ 2.该内存工具是开源的(我也很喜欢开源^_^...),无需安装,只要在你的代码中包含它的头文件.像这样 #include "memwatch" 3.目前用到的最新版本是memwatch-2.71.tar.gz 4.解压 tar -xvf memwatch-2.71.tar.gz 5.在解压文件中将memwatch.c和memwatch.h拷贝到你的程序目录中 6.测试文件中包

java内存泄漏工具查找

https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=4544bafe-c7a2-455f-9d43-eb866ea60091 ibm heapanalyzer