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

Профилирование распределения памяти в С++

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

Есть ли простой способ сделать это? Я работаю над linux и windows, поэтому инструментов любой из платформ хватит.

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

4b9b3361

Ответ 1

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

Ответ 2

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

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();
  ...
}

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

Ответ 3

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

Я думаю, что следующие функции будут полезны для вас.

_CrtMemDumpStatistics _CrtMemDumpAllObjectsSince

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

Глава 1.10 из Game Gems Volume 2 (Ссылка Amazon) подробно описывает простой, но эффективный диспетчер памяти Debug Memory от Peter Dalton, который обеспечивает достойный набор статистических данных при выгрузке журнала.

Ответ 10

Глава 4.6 из Game Gems Volume 8 (ссылка для просмотра Safari Book) содержит подробный профилировщик памяти Ricky Lung, который может отображать выделение статистики в иерархическом стиле вызовов и все же поддерживают многопоточность.

Ответ 11

Просто увидели на сайт AQtime, что у них хорошая поддержка "Профилирование распределения".

Ответ 12

Попробуйте gperftools - он может:

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

Кроме того, это почти не влияет на эффективность программы.