RSS Feed
Download our iPhone app
Browse DevX
Sign up for e-mail newsletters from DevX

Tip of the Day
Language: C++
Expertise: Advanced
May 4, 2004

Identifying Memory Leaks in Linux for C++ Programs

Most C++ programmers agree that it can be harrowing trying to identify the memory leaks in a given program.

If you're working on the GNU/Linux platform, there's an interesting tool you can use to minimize the hassle of this task: mtrace.

Here's some background on mtrace:

  1. You call the mtrace() function to log all memory leaks. The memory allocations and deallocations are logged to a text file pointed to by the environment variable—MALLOC_TRACE.
  2. A Perl utility called mtrace parses the text file logged by your program and identifies the memory leaks.
The following code allocates memory, but does not essentially free it:

#include <stdlib.h>

int main() { 
	int *a;

	a = malloc(sizeof(int)); //Allocate memory
	*a = 7;
	//Notice that we are not freeing memory before we end the program. 
Now, see how to use mtrace to identify the memory leak:
  • Step 1: Setup MALLOC_TRACE environment variable to point to a file where mtrace needs to log the memory allocations:
       setenv MALLOC_TRACE  /home/karthik/temp/trace.txt 
  • Step 2: Insert mtrace hooks into the program:
    #include <stdlib.h>
    #include <mcheck.h> /* Header file to include mtrace related functions */
    int main() { 
    	int *a;
    	mtrace(); /* This starts memory tracing. 
    This has to be done before we do a 'malloc' or we allocate memory.  */
    	a = malloc(sizeof(int));  /* Allocate memory */
    	*a = 7;
    	/* Notice that we are not freeing memory before we end the program.  */
    	return EXIT_SUCCESS;
  • Step 3: Compile the modified program with the debugging options turned on:
        $ gcc -g -Wall -ansi -pedantic leak.c
  • Step 4: Run the program.
  • Step 5: Use the mtrace utility to retrieve the information. Here's what the syntax looks like:
    mtrace <exec_file_name> <malloc_trace_filename> 
    [akkumar@empress work]$ mtrace a.out ~/temp/trace.txt
    Memory not freed:
       Address     Size     Caller
    0x08049910      0x4  at /home/karthik/tips/leak.c:9
This precisely tells you that there is a potential memory leak at line 9:

  a = malloc(sizeof(int));  /* Allocate memory */ 
mtrace is a GNU utility.

The code in this tip was tested on a Linux platform with the gcc 3.2.3.

Karthik Kumar Arun Kumar
Close Icon
Thanks for your registration, follow us on our social networks to keep up-to-date