使用mtrace进行C++内存泄漏检测

13

当我在我的C++程序中使用mtrace时,我会得到以下输出:

未释放的内存:

  Address           Size        Caller 
 0x0804a3c8         0x4 at     0x400b159f 

我如何知道0x400b159f在代码中的位置?

3个回答

9
在许多Unix系统上,您还可以使用addr2line实用程序将地址映射回文件名和行号。该实用程序需要使用调试标志(对于gcc为-g)编译代码。对于一个名为wombat的程序,您可以像这样使用它:
addr2line -e wombat 0x400b159f
它会打印出类似以下的内容:
wombat_helper.c:1023
如果您得到??:0,则无法找到该函数。
更新: mtrace报告的内存地址是调用malloc和free函数的位置。对于C ++,这几乎总是在new和delete运算符中,因此没有其他信息,例如堆栈跟踪,告诉您从程序中的哪个位置调用了new或delete运算符,它的用途非常有限。

4
你可以在gdb中加载你的程序,然后使用info symbol命令。
[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)

有时你需要在主程序开始之前启动你的程序,以加载来自共享库的所有符号。在上面的示例中,调用者是位于libstdc++.so.6中的operator new


1
啊,是的,我忘了在C++中使用mtrace时,报告的位置几乎总是位于new或delete运算符调用中,而不是有用于确定问题所在的代码位置。 - diverscuba23

1
你需要在你的程序中插入mtrace钩子。
#include <mcheck.h>

然后调用

mtrace();

在开始分配任何内存之前。
如果使用g++,还要使用-g进行编译。

mcheck() 需要传递哪些参数? - Ajay
mcheck() 不需要任何参数。:) 但你可以设置 MALLOC_TRACE 环境变量来将其输出到文件中。 - Xorlev
你的意思是,我们需要从代码中调用mtrace()函数,对吗?因为mcheck()是用于检查MS-DOS格式磁盘的磁盘检查实用程序。 - Ajay
没错。mtrace()是函数,我只是不擅长转换东西。 :) - Xorlev
mcheck.h 只在 Linux 上使用吗? - Land

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接