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

Как профилировать использование памяти?

Я знаю Valgrind, но он просто определяет проблемы управления памятью. Я ищу инструмент, который дает мне обзор, какие части моей программы потребляют сколько памяти. Графическое представление, например. карта дерева (как это делает KCachegrind для Callgrind) была бы классной.

Я работаю над машиной Linux, поэтому инструменты Windows не очень помогут мне.

4b9b3361

Ответ 1

Используйте массив, который является частью инструментов Valgrind. Massif-визуализатор может помочь вам представить данные или вы можете просто использовать команду ms_print.

Ответ 2

Попробуйте профилировщик кучи, поставляемый с gperftools, компанией Google. Я всегда создавал его из исходников, но он доступен в виде предварительно скомпилированного пакета в нескольких дистрибутивах Linux.

Это так же просто, как связать динамическую библиотеку с исполняемыми файлами и запустить программу. Он собирает информацию о каждом динамическом распределении памяти (насколько я видел) и сохраняет на диск дамп памяти каждый раз, когда происходит одно из следующих действий:

  • HEAP_PROFILE_ALLOCATION_INTERVAL байты были выделены программой (по умолчанию: 1 Гб)
  • отметка использования памяти высокой воды увеличивается на HEAP_PROFILE_INUSE_INTERVAL байт (по умолчанию: 100 МБ)
  • Прошло HEAP_PROFILE_TIME_INTERVAL секунд (по умолчанию: неактивно)
  • Вы явно вызываете HeapProfilerDump() из своего кода

Последний, по моему опыту, наиболее полезен, потому что вы можете точно определить, когда делать снимок использования кучи, а затем сравнить два разных снимка и посмотреть, что не так.

В конце концов, есть несколько возможных форматов вывода, таких как текстовый или графический (в форме ориентированного графа):

Graph of memory usage

Используя этот инструмент, я смог обнаружить неправильное использование памяти, которое не смог найти с помощью массива.

Ответ 3

gprof - это канонический способ сделать это с помощью GCC. Компилятор уже поддерживает его. Вам понадобится немного усилий, чтобы получить "графическое" древовидное представление, но вы можете легко получить текстовый отчет о представлении дерева.

Ответ 4

"Более новым" вариантом является HeapTrack. В отличие от массива, это инструментальная версия malloc/free которая хранит все вызовы и выводит журнал.

Графический интерфейс хорош (но требует Qt5 IIRC), и временные характеристики результатов (потому что вы также можете отслеживать время) менее предвзяты, чем valgrind (так как они не эмулируются).

Ответ 5

Использовать опцию callgrind с valgrind