Mtrace
mtrace is the memory debugger included in the C Library">C (programming language)">C Library.Use
mtrace tool works only with single threaded applications. In a multithreaded application a problem exists that one thread could temporarily remove the hook while another thread could malloc memory leading to missed allocations.The function
mtrace installs handlers for malloc, realloc and free; the function muntrace disables these handlers. Their prototypes, defined in the header file , arevoid mtrace;
void muntrace;
The handlers log all memory allocations and frees to a file defined by the environment variable
MALLOC_TRACE.A Perl script called
mtrace, not to be confused with the function of the same name, is also distributed with the GNU C Library; the script parses through the output file and reports all allocations that were not freed.Usage example
Bad source code
The following is an example of bad source code. The problem with the program is that it allocates memory, but doesn't free the memory before exiting.- include
MTrace usage
- Set the environment variable
MALLOC_TRACEto the pathname of the desired output file. Setting environment variables is slightly different in each shell. In Bourne Shell-compatible shells, like Bash, the command is as follows: - :
$ export MALLOC_TRACE
- Include
mcheck.hin the source code. This is done, for example, by adding the following line to the top of a C or C++ file, as shown below: - :
- include
- Call the function
mtracebefore allocating memory. It is usually easiest to callmtraceat the very beginning of themainfunction: - :
- :To delineate the end of the code that should be traced, call the function
muntrace. This is usually done at the end of themainfunction: - :
- Compile and run the program as usual. Note that one must compile with the
-gflag to get useful output. In GCC on Linux, this can be done using the following commands for a C program: - :
$./a.out
- Memory leak information will be reported in the file specified by the
MALLOC_TRACEenvironment variable. The difficulty is, this file will be in a computer-readable format. Most Linux machines come with a console command calledmtrace, that converts the computer readable format into human-readable text as shown below. There is a Perl script, of the same name, that can be downloaded to accomplish the same task, in the event that one does not have access to the commandmtrace. Themtracesyntax is as follows: - :
- :For example:
- :
-
mtracecan be used with parallel computing but one process at a time, using a condition on the rank like: - :
MTrace output
If the mtrace command reports “No Memory Leaks”, then all memory that was allocated in the last execution of that program was also released, which is the way it should be. If, on the other hand, mtrace gives output such as that below, it means the programmer still has some work to do.
Memory not freed:
-----------------
Address Size Caller
0x08049910 0x4 at /home/sureshsathiah/tips/leak.c:9
Good source code
The following is an example of good source code. It releases memory after it is allocated, and it uses mtrace to notify the programmer if there are memory leaks.- include
- include