отследите выделения памяти C++

calculate f a b = tail . concatMap (replicate 2) . scanl f a $ b.

Возможно, бит репликации ошибочный. Если так, то просто calculate = scanl.

Это переводит код, так как «[a, f(a,b), f(f(a,b),b, ..]» из текста противоречит ему (и это противоречит самому тексту, который говорит об «итерации - списка b») .

47
задан genpfault 1 February 2012 в 21:11
поделиться

7 ответов

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

Я также получил много полезных ответов в SWENG (Список рассылки по разработке программного обеспечения). Тема называется «[Sweng-Gamedev] отслеживает использование памяти C ++?»

7
ответ дан 26 November 2019 в 19:47
поделиться

IDE Visual Studio имеет встроенную поддержку профилирования "кучи" (с 2015), с которой является, вероятно, самым легким запустить. Это имеет графические представления использования "кучи" со временем и может отследить выделения функцией/методом.

heap profiling

CRT также имеет отладку и поддержку профиля, которая более подробна и больше низкого уровня. Вы могли отследить данные и вывести результаты на печать с помощью некоторого другого инструмента:

, В частности, посмотрите _CrtMemCheckpoint и связанные функции.

0
ответ дан 26 November 2019 в 19:47
поделиться

Use Valgrind and its tool Massif. Its example output (a part of it):

99.48% (20,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->49.74% (10,000B) 0x804841A: main (example.c:20)
| 
->39.79% (8,000B) 0x80483C2: g (example.c:5)
| ->19.90% (4,000B) 0x80483E2: f (example.c:11)
| | ->19.90% (4,000B) 0x8048431: main (example.c:23)
| |   
| ->19.90% (4,000B) 0x8048436: main (example.c:25)
|   
->09.95% (2,000B) 0x80483DA: f (example.c:10)
  ->09.95% (2,000B) 0x8048431: main (example.c:23)

So, you will get detailed information:

  • WHO allocated the memory (functions: g(), f(), and main() in above example); you also get complete backtrace leading to allocating function,
  • to WHICH data structure the memory did go (no data structures in above example),
  • WHEN it happened,
  • what PERCENTAGE of all allocated memory it is (g: 39.7%, f: 9.95%, main: 49.7%).

Here is Massif manual

You can track heap allocation as well as stack allocation (turned off by default).

PS. I just read that you're on Windows. I will leave the answer though, because it gives a picture of what you can get from a possible tool.

31
ответ дан 26 November 2019 в 19:47
поделиться

Для обычного трекера памяти C ++ вам необходимо перегрузить следующее:

global operator new
global operator new []
global operator delete
global operator delete []
any class allocators
any in-place allocators

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

#undef new

void *operator new (size_t size, char *file, int line, char *function);
// other operators

#define new new (__FILE__, __LINE__, __FUNCTION__)

и создайте исходный файл с:

void *operator new (size_t size, char *file, int line, char *function)
{
  // add tracking code here...
  return malloc (size);
}

Вышеупомянутое работает, только если у вас нет оператора new, определенного в области класса. Если у вас есть что-то в области класса, выполните:

#define NEW new (__FILE__, __LINE__, __FUNCTION__)

и замените 'новый тип' на 'НОВЫЙ тип', но это потенциально потребует изменения большого количества кода.

Поскольку это макрос, удаление трекера памяти довольно просто заголовок становится:

#if defined ENABLED_MEMORY_TRACKER
#undef new

void *operator new (size_t size, char *file, int line, char *function);
// other operators

#define NEW new (__FILE__, __LINE__, __FUNCTION__)
#else
#define NEW new
#endif

, а файл реализации:

#if defined ENABLED_MEMORY_TRACKER
void *operator new (size_t size, char *file, int line, char *function)
{
  // add tracking code here...
  return malloc (size);
}
endif
14
ответ дан 26 November 2019 в 19:47
поделиться

Microsoft имеет хорошо документированные функции отслеживания памяти. Однако по какой-то причине они малоизвестны в сообществе разработчиков. Это функции отладки CRT. Хорошей отправной точкой будут Функции кучи отладки CRT .

Проверьте следующие ссылки для получения дополнительных сведений.

  1. Функции отчетов о состоянии кучи
  2. Отслеживание запросов на выделение кучи . Вероятно, это та функциональность, которую вы ищете.
19
ответ дан 26 November 2019 в 19:47
поделиться

Попробуйте и этот: Средство проверки памяти

1
ответ дан 26 November 2019 в 19:47
поделиться

On Mac OS X, you can use the code profiling tool Shark to do this, IIRC.

0
ответ дан 26 November 2019 в 19:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: