Ответ 1
Используйте массив, который является частью инструментов Valgrind. Massif-визуализатор может помочь вам представить данные или вы можете просто использовать команду ms_print
.
Я знаю Valgrind, но он просто определяет проблемы управления памятью. Я ищу инструмент, который дает мне обзор, какие части моей программы потребляют сколько памяти. Графическое представление, например. карта дерева (как это делает KCachegrind для Callgrind) была бы классной.
Я работаю над машиной Linux, поэтому инструменты Windows не очень помогут мне.
Используйте массив, который является частью инструментов Valgrind. Massif-визуализатор может помочь вам представить данные или вы можете просто использовать команду ms_print
.
Попробуйте профилировщик кучи, поставляемый с gperftools, компанией Google. Я всегда создавал его из исходников, но он доступен в виде предварительно скомпилированного пакета в нескольких дистрибутивах Linux.
Это так же просто, как связать динамическую библиотеку с исполняемыми файлами и запустить программу. Он собирает информацию о каждом динамическом распределении памяти (насколько я видел) и сохраняет на диск дамп памяти каждый раз, когда происходит одно из следующих действий:
HEAP_PROFILE_ALLOCATION_INTERVAL
байты были выделены программой (по умолчанию: 1 Гб)HEAP_PROFILE_INUSE_INTERVAL
байт (по умолчанию: 100 МБ)HEAP_PROFILE_TIME_INTERVAL
секунд (по умолчанию: неактивно)HeapProfilerDump()
из своего кодаПоследний, по моему опыту, наиболее полезен, потому что вы можете точно определить, когда делать снимок использования кучи, а затем сравнить два разных снимка и посмотреть, что не так.
В конце концов, есть несколько возможных форматов вывода, таких как текстовый или графический (в форме ориентированного графа):
Используя этот инструмент, я смог обнаружить неправильное использование памяти, которое не смог найти с помощью массива.
gprof - это канонический способ сделать это с помощью GCC. Компилятор уже поддерживает его. Вам понадобится немного усилий, чтобы получить "графическое" древовидное представление, но вы можете легко получить текстовый отчет о представлении дерева.
"Более новым" вариантом является HeapTrack. В отличие от массива, это инструментальная версия malloc
/free
которая хранит все вызовы и выводит журнал.
Графический интерфейс хорош (но требует Qt5 IIRC), и временные характеристики результатов (потому что вы также можете отслеживать время) менее предвзяты, чем valgrind (так как они не эмулируются).
Использовать опцию callgrind с valgrind