MTRACE - Linux手册页
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)。
Interface | Attribute | Value |
mtrace(),muntrace() | Thread safety | MT-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:
$ 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/。