`

Linux C 编程内存泄露检测工具(一):mtrace

阅读更多

前言

所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用工具来检测内存泄露的情況,包括:

  1. mtrace
  2. dmalloc
  3. memwatch

1. mtrace

mtrace是三款工具之中是最简单易用的,mtrace是一个C函數,在<mcheck.h>里声明及定义,函数原型为:

    void mtrace(void);

其实mtrace是类似malloc_hook的 malloc handler,只不过mtrace的handler function已由系统为你写好,但既然如此,系统又怎么知道你想将malloc/free的记录写在哪里呢?为此,调用mtrace()前要先设置 MALLOC_TRACE环境变量:

    #include <stdlib.h>
    ....
    setenv("MALLOC_TRACE", "output_file_name", 1);
    ...

「output_file_name」就是储存检测结果的文件的名称。

但是检测结果的格式是一般人无法理解的,而只要有安装mtrace的话,就会有一名为mtrace的Perl script,在shell输入以下指令:

    mtrace [binary] output_file_name

就会将output_file_name的內容转化成能被理解的语句,例如「No memory leaks」,「0x12345678 Free 10 was never alloc」诸如此类。

例如以下有一函数:(暂且放下single entry single exit的原则)

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <mcheck.h>
    int main() {
        char *hello;
   
        setenv("MALLOC_TRACE", "output", 1);
        mtrace();
        if ((hello = (char *) malloc(sizeof(char))) == NULL) {
            perror("Cannot allocate memory.");
            return -1;
        }

        return 0;
    }

执行后,再用mtrace 将结果输出:

    - 0x08049670 Free 3 was never alloc'd 0x42029acc
    - 0x080496f0 Free 4 was never alloc'd 0x420dc9e9
    - 0x08049708 Free 5 was never alloc'd 0x420dc9f1
    - 0x08049628 Free 6 was never alloc'd 0x42113a22
    - 0x08049640 Free 7 was never alloc'd 0x42113a52
    - 0x08049658 Free 8 was never alloc'd 0x42113a96

    Memory not freed:
    -----------------
       Address     Size     Caller
    0x08049a90      0x1  at 0x80483fe

最后一行标明有一个大小为1 byte的内存尚未释放,大概是指「hello」吧。

    若我们把该段内存释放:
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <mcheck.h>
    int main() {
        char *hello;
   
        setenv("MALLOC_TRACE", "output", 1);
        mtrace();
        if ((hello = (char *) malloc(sizeof(char))) == NULL) {
            perror("Cannot allocate memory.");
            return -1;
        }

        free(hello);
        return 0;
    }

结果如下:

    - 0x080496b0 Free 4 was never alloc'd 0x42029acc
    - 0x08049730 Free 5 was never alloc'd 0x420dc9e9
    - 0x08049748 Free 6 was never alloc'd 0x420dc9f1
    - 0x08049668 Free 7 was never alloc'd 0x42113a22
    - 0x08049680 Free 8 was never alloc'd 0x42113a52
    - 0x08049698 Free 9 was never alloc'd 0x42113a96
    No memory leaks.

mtrace的原理是记录每一对malloc-free的执行,若每一个malloc都有相应的free,则代表没有内存泄露,对于任何非malloc/free情況下所发生的内存泄露问题,mtrace并不能找出来。

分享到:
评论

相关推荐

    Linux 内存泄露查找

    mtrace是一款功能强大的内存跟踪工具,用于检测C/C++程序中的内存泄露和其他内存错误。与dmalloc和memwatch相比,mtrace更加轻量级且易于使用,特别适合于初步诊断内存泄露问题。 #### 三、mtrace工作原理 mtrace...

    LinuxC编程侦测记忆体溢出工具mtrace[参照].pdf

    Linux C编程中的内存管理是开发过程中非常重要的一个环节,因为不当的内存操作可能导致内存泄漏、程序崩溃等严重问题。为了检测内存泄漏,Linux提供了多种工具,其中包括mtrace。mtrace是一个简单易用的内存泄漏检测...

    mtrace源码-MTrace FOSS

    【mtrace源码-MTrace FOSS】是一款开源的MTrace工具,主要用于MATLAB环境下的内存追踪和性能分析。MTrace的全称可能是“Memory Trace”,它帮助开发者深入了解MATLAB程序在运行过程中的内存分配和释放行为,从而优化...

    用mtrace分析内存泄露

    #### 一、为何选择mtrace作为内存泄露分析工具 在嵌入式系统中,内存管理至关重要。对于这类系统中的程序,通常会在启动时分配大量内存,并持续运行而不释放这些内存。因此,关注点主要集中在程序初始化后运行过程...

    内存溢出Linux下用Mtrace来检查程序内存溢出.pdf

    ### 内存溢出:Linux下使用Mtrace检查程序内存溢出 #### 一、内存溢出概述 内存溢出是指程序申请的内存超过系统所能提供的空闲内存时出现的一种异常现象。通常情况下,内存溢出会导致程序崩溃或运行异常。在Linux...

    Linux下用Mtrace来检查程序内存溢出

    然而,Linux提供了一个强大的工具——Mtrace,它能够有效地帮助开发者追踪内存分配和泄漏的问题。本文将深入探讨如何使用Mtrace来检查程序的内存行为。 首先,要启用Mtrace功能,你需要在待调试的程序中引入`...

    mtrace源码-MTrace FOSS.zip

    mtrace,全称为Memory Trace,是一种用于内存跟踪和分析的工具,它可以帮助开发者理解和优化程序的内存使用情况。MTrace FOSS是mtrace的一个开源版本,提供了源代码,使得用户可以更深入地了解其工作原理并进行定制...

    mstrace内存泄露检测工具

    rpm -ivh glibc-utils-2.9-2.i386 使用时候: [root@zzt]$export MALLOC_TRACE=mytrace.log [root@zzt]$ gcc testmtrace.c -o testmtrace [root@zzt]$./testmtrace [root@zzt]$ mtrace testmtrace mytrace.log

    Linux内存泄漏检测方法总结

    总结起来,Linux内存泄漏的检测方法包括使用Valgrind、mtrace、SystemTap、dmesg、top等工具,以及依赖静态代码分析和理解内存管理策略。在aarch32这样的嵌入式环境中,还需要考虑交叉编译和目标系统的特定需求。...

    mtrace 源码

    为了解决这一问题,开发者们使用各种工具进行内存跟踪,其中mtrace就是一款强大的工具,专门用于跟踪和分析程序的内存使用情况。本文将详细阐述mtrace的功能、工作原理以及如何使用它来诊断内存问题。 mtrace主要...

    美团的Mtrace分布式会话跟踪系统架构设计与实践

    ### 美团Mtrace分布式会话跟踪系统架构设计与实践 #### 一、Mtrace项目简介 Mtrace是美团内部开发的一款分布式会话...未来,随着分布式系统的发展,Mtrace将继续进化和完善,成为支撑大规模分布式服务的重要工具。

    mtrace.rar_mtrace

    `mtrace`是Linux系统上的一种调试工具,主要通过对`malloc`、`calloc`、`realloc`、`free`等内存分配函数进行hook,记录每一次内存操作的相关信息。这些信息包括分配的内存大小、分配的位置(调用栈信息)等,通过...

    mtrace使用.doc

    mtrace 是一个内存跟踪工具,可以帮助开发者检测和解决内存泄露问题。下面是 mtrace 的使用步骤和相关知识点: 环境变量设置 在使用 mtrace 之前,需要定义环境变量。在 env.c 文件中加入环境变量的设置,例如:`...

    memleak-0.3.0.tar.gz_memleak-0.3.0.tar_mtrace.tar.gz_内存泄露_嵌入式_泄露

    "memleak-0.3.0.tar.gz" 和 "mtrace.tar.gz" 是两个压缩包文件,它们提供了用于检测内存泄露的工具。让我们深入探讨这两个工具以及它们如何帮助解决这个问题。 `memleak.c` 和 `memleak.h` 是 `memleak-0.3.0.tar` ...

    LINUX基本的程序调试技能及相关工具的使用,包括GDB(DDD)、Mtrace、strace

    Mtrace是一个内存泄漏检测工具,主要用于C和C++程序。它与`malloc`和`free`等内存分配函数配合工作,记录内存分配和释放的情况。在程序运行结束后,Mtrace会生成一个报告,显示哪些内存块未被正确释放,帮助开发者...

    Linux C函数参考 内存控制篇.rar

    在Linux系统中,C语言是进行底层编程和系统开发的常用工具。内存控制是C程序设计中的关键部分,它涉及到动态内存分配、释放以及有效管理内存资源。本资料集主要探讨了Linux环境下C语言的内存控制函数,这些函数在...

    node-mtrace:节点的本机内存分配跟踪和mtrace日志解析

    节点的本机内存跟踪和mtrace日志解析。 支持平台 仅Linux。 用法 使用npm install mtrace : npm install mtrace 生成一个mtrace: var mtrace = require ( 'mtrace' ) ; var filename = mtrace . mtrace ( ) ; if...

    malloc内存泄漏

    - **Valgrind**:这是一个强大的工具集,可用于检测内存泄漏和其他内存错误。使用示例如下: ```bash $ valgrind --leak-check=full ./a.out ``` - **mcheck.h**:提供了一个简单的接口来跟踪内存分配和释放。 ...

Global site tag (gtag.js) - Google Analytics