Когда я использую mtrace в моей программе на С++, я получаю вывод, как показано ниже.
Память не освобождена:
Address Size Caller
0x0804a3c8 0x4 at 0x400b159f
Как узнать, где в коде 0x400b159f?
Когда я использую mtrace в моей программе на С++, я получаю вывод, как показано ниже.
Address Size Caller
0x0804a3c8 0x4 at 0x400b159f
Как узнать, где в коде 0x400b159f?
Во многих системах unix вы также можете использовать утилиту addr2line для сопоставления адреса с именем файла и номером строки. Эта утилита требует, чтобы код был скомпилирован с флагом отладки (-g для gcc). Для программы с именем wombat вы будете использовать ее так:
addr2line -e wombat 0x400b159f
и он выведет что-то вроде
wombat_helper.c: 1023
если вы получаете??: 0, он не может найти функцию.
UPDATE: Адреса памяти, о которых сообщает mtrace, - это места, где вызывается malloc и бесплатные функции. Для С++ это почти всегда в новых и удаленных операциях и, следовательно, будет очень ограниченным, без какой-либо другой информации, такой как трассировка стека, чтобы указать, откуда в вашей программе вызывается новый или удалить оператор.
Вам нужно вставить mtrace hooks в вашу программу.
#include <mcheck.h>
Затем вызовите
mtrace();
Прежде чем вы начнете выделять любую память.
Также скомпилируйте с помощью -g
, если вы используете g++.
Вы можете загрузить свою программу в gdb и использовать команду info symbol
[[email protected] ~]#
[[email protected] ~]# mtrace ./a.out mtrace.log
Memory not freed:
-----------------
Address Size Caller
0x08de3378 0x4 at 0x42028da
[[email protected] ~]#
[[email protected] ~]#
[[email protected] ~]#
[[email protected] ~]#
[[email protected] ~]# 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)
Также вам может потребоваться запустить вашу программу до начала основной процедуры для загрузки всех символов из разделяемых библиотек. В приведенном выше примере вызывающий оператор оператор new, который находится в libstdС++. So.6.