Профилирование распределения памяти в C ++ - PullRequest
39 голосов
/ 31 марта 2009

Я пишу приложение и с удивлением вижу, что его общее использование памяти уже слишком велико. Я хочу профилировать динамическое использование памяти моего приложения: сколько объектов каждого вида находится в куче, и какие функции создали эти объекты? Кроме того, сколько памяти используется каждым объектом?

Есть ли простой способ сделать это? Я работаю как на Linux, так и на Windows, поэтому инструментов любой из платформ будет достаточно.

ПРИМЕЧАНИЕ: я не беспокоюсь об утечках памяти здесь.

Ответы [ 12 ]

14 голосов
/ 31 марта 2009

Вы пробовали Valgrind ? Это инструмент профилирования для Linux. У него есть средство проверки памяти (для утечек памяти и других проблем с памятью), называемое Memcheck, но также имеется профилировщик кучи по имени Massif.

9 голосов
/ 31 марта 2009

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

template<class T>
class Stats {
  static int instance_count;
public:
  Stats() {
    instance_count++;
  }
  ~Stats() {
    instance_count--;
  }
  static void print() {
    std::cout << instance_count << " instances of " << typeid(T).name() <<
        ", " << sizeof(T) << " bytes each." << std::endl;
  }
};

template<class T>
int Stats<T>::instance_count = 0;

Затем вы можете добавить это как базовый класс к классам, которые, как вы подозреваете, имеют много экземпляров, и распечатать статистику текущего использования памяти:

class A : Stats<A> {
};

void print_stats() {
  Stats<A>::print();
  Stats<B>::print();
  ...
}

Это не показывает вам, в каких функциях были распределены объекты, и не дает слишком много деталей, но этого может быть достаточно, чтобы определить, где тратится память.

8 голосов
/ 31 марта 2009

Для окон проверьте функции в "crtdbg.h". crtdbg.h содержит отладочную версию функций выделения памяти. Он также содержит функцию обнаружения утечек памяти, повреждений, проверки правильности указателей кучи и т. Д.

Думаю, вам пригодятся следующие функции.

_CrtMemDumpStatistics _CrtMemDumpAllObjectsSince

По ссылке MSDN перечислены функции отчетов о состоянии кучи и пример кода http://msdn.microsoft.com/en-us/library/wc28wkas(VS.80).aspx

5 голосов
/ 31 марта 2009

Вы можете попробовать Memory Validator с http://www.softwareverify.com/cpp/memory/index.html

Это один из лучших инструментов, которые мне встречались для профилирования использования памяти. 30-дневная ознакомительная версия доступна для бесплатного скачивания.

3 голосов
/ 10 марта 2015

MTuner - бесплатный профилировщик памяти C / C ++. Описание ниже:

MTuner - это многоплатформенный инструмент для профилирования памяти, обнаружения и анализа утечек, поддерживающий компиляторы MSVC, GCC и Clang. Возможности включают в себя: историю активности памяти на временной шкале, мощную фильтрацию, SDK для ручного инструментария с полным исходным кодом, поддержку непрерывной интеграции с использованием командной строки, обнаружение утечки памяти и многое другое. Профилируйте любые платформы программного обеспечения с кросс-компиляторами GCC или Clang. Поставляется со встроенной поддержкой платформ Windows, PlayStation 4 и PlayStation 3 и платформой, ориентированной на кросс-компилятор на базе Windows.

3 голосов
/ 31 марта 2009

Есть несколько вещей, которые вы можете сделать. Самое простое - связать отладочную библиотеку malloc; их доступно несколько, в зависимости от деталей вашей среды (например, google для _malloc_dbg для Windows.)

Второй вариант: вы можете перегрузить new и delete в C ++; возможно перегрузить базовое новое и удалить новыми функциями, которые отслеживают распределение и использование памяти.

2 голосов
/ 29 октября 2011

Я только что выпустил win32 собственный профилировщик памяти MemPro, как бесплатную бета-версию. http://www.puredevsoftware.com/MemPro.htm. Он подключается к новому / удаляет и отправляет данные во внешнее приложение, где вы можете просматривать распределения различными способами. Надеюсь, что это поможет.

1 голос
/ 17 марта 2010

Глава 4.6 из Gems Programming Gems Volume 8 (ссылка на предварительный просмотр книги Safari) детализирует расширенный профилировщик памяти Рики Лунга, который может отображать статистику распределения в иерархическом порядке стека вызовов и при этом поддерживать многопоточность .

1 голос
/ 31 марта 2009

Глава 1.10 из Gems Programming Gems Volume 2 ( Amazon link ) подробно описывает простой, но эффективный менеджер отладочной памяти от Питера Далтона, который предоставляет приличный набор статистики, когда вы сбросить журнал.

1 голос
/ 31 марта 2009

В предыдущей работе мы использовали инструмент под названием «Очистить». Это продукт, созданный Rational / IBM. Я не думаю, что это бесплатный инструмент, но я помню, что он довольно хорош. Вот некоторая информация:

http://en.wikipedia.org/wiki/IBM_Rational_Purify

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