Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using mtrace for c++

Tags:

c++

When i use mtrace in my c++ programme,i get output like the following

Memory not freed:

  Address           Size        Caller 
 0x0804a3c8         0x4 at     0x400b159f 

How do i know where in the code is 0x400b159f?

like image 752
Ajay Avatar asked Feb 13 '10 07:02

Ajay


2 Answers

On many unix systems you can also use the addr2line utility to map an address back to a file name and line number. This utility requires that the code be compiled with the debug flag (-g for gcc). For a program named wombat you would use it like such:

addr2line -e wombat 0x400b159f

and it will print out something like

wombat_helper.c:1023

if you get ??:0 it can't find the function.

UPDATE: The memory addresses reported by mtrace are the locations where the malloc and free functions are called. For C++, this is almost always in the new and delete operators, and thus would be of very limited use, without other information, such as a stack trace to tell where in your program new or delete operator is called from.

like image 174
diverscuba23 Avatar answered Sep 23 '22 17:09

diverscuba23


You can load your program in gdb and use info symbol command

[root@localhost ~]#
[root@localhost ~]# mtrace ./a.out mtrace.log

Memory not freed:
-----------------
   Address     Size     Caller
0x08de3378      0x4  at 0x42028da
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# gdb ./a.out
GNU gdb (GDB) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/a.out...done.
(gdb) start
Temporary breakpoint 1 at 0x80484fd: file test.cpp, line 6.

Temporary breakpoint 1, main () at test.cpp:6
6               mtrace();
(gdb) info symbol 0x42028da
operator new(unsigned int) + 42 in section .text of /usr/lib/libstdc++.so.6
(gdb)

Also you may need to start your program until the beginning of the main procedure to load all symbols from shared libraries. In the example above the caller is operator new which is located in libstdc++.so.6.

like image 38
ks1322 Avatar answered Sep 19 '22 17:09

ks1322