Подтвердить что ты не робот

Использование mtrace для С++

Когда я использую mtrace в моей программе на С++, я получаю вывод, как показано ниже.

Память не освобождена:

  Address           Size        Caller 
 0x0804a3c8         0x4 at     0x400b159f 

Как узнать, где в коде 0x400b159f?

4b9b3361

Ответ 1

Во многих системах unix вы также можете использовать утилиту addr2line для сопоставления адреса с именем файла и номером строки. Эта утилита требует, чтобы код был скомпилирован с флагом отладки (-g для gcc). Для программы с именем wombat вы будете использовать ее так:

addr2line -e wombat 0x400b159f

и он выведет что-то вроде

wombat_helper.c: 1023

если вы получаете??: 0, он не может найти функцию.

UPDATE: Адреса памяти, о которых сообщает mtrace, - это места, где вызывается malloc и бесплатные функции. Для С++ это почти всегда в новых и удаленных операциях и, следовательно, будет очень ограниченным, без какой-либо другой информации, такой как трассировка стека, чтобы указать, откуда в вашей программе вызывается новый или удалить оператор.

Ответ 2

Вам нужно вставить mtrace hooks в вашу программу.

#include <mcheck.h>

Затем вызовите

mtrace();

Прежде чем вы начнете выделять любую память.

Также скомпилируйте с помощью -g, если вы используете g++.

Ответ 3

Вы можете загрузить свою программу в 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.