MTRACE - Linux手册页

时间:2019-08-20 18:00:55  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2020-06-09

名称

mtrace,muntrace-malloc跟踪

语法

#包括

void mtrace(void);

void muntrace(void);

说明

mtrace()函数为内存分配函数(malloc(3),realloc(3),memalign(3),free(3))安装挂钩函数。这些挂钩函数记录有关内存分配和释放的跟踪信息。跟踪信息可用于发现内存泄漏,并尝试释放程序中未分配的内存。

muntrace()函数禁用mtrace()安装的挂钩函数,以便不再为内存分配函数记录跟踪信息。如果mtrace()没有成功安装任何钩子函数,则muntrace()不会执行任何操作。

调用mtrace()时,它将检查环境变量MALLOC_TRACE的值,该值应包含要在其中记录跟踪信息的文件的路径名。如果成功打开路径名,则路径名将被截断为零长度。

如果未设置MALLOC_TRACE,或其指定的路径名​​无效或不可写,则不安装任何挂钩函数,并且mtrace()无效。在set-user-ID和set-group-ID程序中,MALLOC_TRACE被忽略,并且mtrace()不起作用。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
mtrace(),muntrace()Thread safetyMT-Unsafe

遵循规范

这些功能是GNU扩展。

备注

在正常使用中,mtrace()在程序执行开始时被调用一次,而muntrace()从不被调用。

调用mtrace()之后产生的跟踪输出是文本的,但并非旨在使人类可读。 GNU C库提供了一个Perl脚本mtrace(1),该脚本解释了跟踪日志并产生了可读的输出。为了获得最佳结果,应在启用调试的情况下编译跟踪程序,以便将行号信息记录在可执行文件中。

mtrace()执行的跟踪会导致性能下降(如果MALLOC_TRACE指向有效的可写路径名)。

BUGS

mtrace(1)生成的行号信息并不总是精确的:行号引用可能引用源代码的上一行或下一行(非空白)。

示例

下面的shell会话演示了mtrace()函数和mtrace(1)命令在程序中的使用,该程序在两个不同的位置都有内存泄漏。该演示使用以下程序:

$ cat t_mtrace.c
#include <mcheck.h>
#include <stdlib.h>
#include <stdio.h>

int
main(int argc, char *argv[])
{
    int j;

    mtrace();

    for (j = 0; j < 2; j++)
        malloc(100);            /* Never freed--a memory leak */

    calloc(16, 16);             /* Never freed--a memory leak */
    exit(EXIT_SUCCESS);
}

当我们按如下方式运行程序时,我们看到mtrace()诊断出的内存泄漏在程序中的两个不同位置:

$ cc -g t_mtrace.c -o t_mtrace
$ export MALLOC_TRACE=/tmp/t
$ ./t_mtrace
$ mtrace ./t_mtrace $MALLOC_TRACE
Memory not freed:

Address Size Caller
0x084c9378 0x64 at /home/cecilia/t_mtrace.c:12
0x084c93e0 0x64 at /home/cecilia/t_mtrace.c:12
0x084c9448 0x100 at /home/cecilia/t_mtrace.c:16

有关未释放内存的前两个消息对应于for循环内的两个malloc(3)调用。最终消息对应于对calloc(3)的调用(后者依次调用malloc(3))。

另外参见

mtrace(1),malloc(3),malloc_hook(3),mcheck(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/