.\" the source, must acknowledge the copyright and authors of this work.
.\" %%%LICENSE_END
.\"
-.TH MTRACE 3 2012-04-18 "GNU" "Linux Programmer's Manual"
+.TH MTRACE 3 2017-09-15 "GNU" "Linux Programmer's Manual"
.SH NAME
mtrace, muntrace \- malloc tracing
.SH SYNOPSIS
.B "#include <mcheck.h>"
-.sp
+.PP
.B "void mtrace(void);"
-.sp
+.PP
.B "void muntrace(void);"
.SH DESCRIPTION
The
and deallocation.
The tracing information can be used to discover memory leaks and
attempts to free nonallocated memory in a program.
-
+.PP
The
.BR muntrace ()
function disables the hook functions installed by
.BR mtrace (),
.BR muntrace ()
does nothing.
-
+.PP
When
.BR mtrace ()
is called, it checks the value of the environment variable
which should contain the pathname of a file in which
the tracing information is to be recorded.
If the pathname is successfully opened, it is truncated to zero length.
-
+.PP
If
.BR MALLOC_TRACE
is not set,
T{
.BR mtrace (),
.BR muntrace ()
-.\" FIXME: the following marking is different from which in glibc manual,
-.\" markings in glibc manual are more detailed.
-.\" mtrace: MT-Unsafe env race:mtrace const:malloc_hooks init
-.\" muntrace: MT-Unsafe race:mtrace const:malloc_hooks locale
-.\" But there is something wrong in glibc manual, for example:
-.\" glibc manual says muntrace should have marking locale because it calls
-.\" fprintf(), but muntrace does not execute area which cause locale problem.
T} Thread safety MT-Unsafe
.TE
+.\" FIXME: The marking is different from that in the glibc manual,
+.\" markings in glibc manual are more detailed:
+.\"
+.\" mtrace: MT-Unsafe env race:mtrace const:malloc_hooks init
+.\" muntrace: MT-Unsafe race:mtrace const:malloc_hooks locale
+.\"
+.\" But there is something wrong in glibc manual, for example:
+.\" glibc manual says muntrace should have marking locale because it calls
+.\" fprintf(), but muntrace does not execute area which cause locale problem.
.SH CONFORMING TO
These functions are GNU extensions.
.SH NOTES
is called once at the start of execution of a program, and
.BR muntrace ()
is never called.
-
+.PP
The tracing output produced after a call to
.BR mtrace ()
is textual, but not designed to be human readable.
For best results,
the traced program should be compiled with debugging enabled,
so that line-number information is recorded in the executable.
-
+.PP
The tracing performed by
.BR mtrace ()
incurs a performance penalty (if
.BR mtrace (1)
command in a program that has memory leaks at two different locations.
The demonstration uses the following program:
+.PP
.in +4
-.nf
-
+.EX
.RB "$ " "cat t_mtrace.c"
#include <mcheck.h>
#include <stdlib.h>
calloc(16, 16); /* Never freed\-\-a memory leak */
exit(EXIT_SUCCESS);
}
-
-.fi
+.EE
.in
+.PP
When we run the program as follows, we see that
.BR mtrace ()
diagnosed memory leaks at two different locations in the program:
+.PP
.in +4n
-.nf
-
+.EX
.RB "$ " "cc \-g t_mtrace.c \-o t_mtrace"
.RB "$ " "export MALLOC_TRACE=/tmp/t"
.RB "$ " "./t_mtrace"
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
-.fi
+.EE
.in
-
+.PP
The first two messages about unfreed memory correspond to the two
.BR malloc (3)
calls inside the