Всем привет, хочу найти утечку с помощью функций mtrace/muntrace, но не могу понять, почему утилита addr2line не может перевести адрес в код и строку.
Вот демо-пример:
#include <mcheck.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
mtrace();
for (int j = 0; j < 2; j++)
malloc(100); /* Never freed--a memory leak */
calloc(16, 16); /* Never freed--a memory leak */
exit(EXIT_SUCCESS);
}
Пробовал собирать с разными уровнями включения отладочных символов:
g++ -g test.cpp -o test
g++ -g3 -ggdb test.cpp -o test
g++ -g3 test.cpp -o test
g++ -O0 -g3 test.cpp -o test
g++ -g -rdynamic test.cpp -o test
g++ -g3 -rdynamic test.cpp -o test
Запускаю приложение:
MALLOC_TRACE=/tmp/test.log ./test
Получаю вывод с помощью команды mtrace ./test /tmp/test.log
:
Memory not freed:
-----------------
Address Size Caller
0x00005586d69a6690 0x64 at 0x5586d6472190
0x00005586d69a6700 0x64 at 0x5586d6472190
0x00005586d69a6770 0x100 at 0x5586d64721a5
Утилита mtrace пытается конвертировать адреса в читабельные строки в коде с помощью addr2line, но ничего не выходит. Что я делаю не так?
Дополнительная информация:
- Когда в malloc включена трассировка, адреса вызывающих функцию malloc/realloc/free функций определяются через встроенную в gcc функцию: __builtin_return_address(0)
- Далее этот адрес через функцию dladdr преобразуется в пару <бинарник>[адрес]
- утилита mtrace использует далее парсит пару <бинарник>[адрес] и отдает addr2line