Любой инструмент для определения размера памяти, выделяемой динамически с помощью malloc / realloc? - PullRequest
1 голос
/ 03 марта 2010

У меня есть рабочее пространство MS-Visual Studio 2005 со всем кодом c. Это приложение (exe) динамически распределяет память из кучи, используя malloc и realloc. Я хочу вычислить максимальный размер выделенного размера, выделенного для кучи, используя malloc / realloc этой прикладной программой, когда я запускаю конкретный контрольный пример.

Я не хочу менять код, отмечая размеры malloc и накапливая их, потому что:

a) может быть сценарий, что некоторая память объемом 1 КБ выделяется, затем освобождается, а затем память объемом 2 КБ выделяется. Таким образом, максимальное значение равно 2 КБ, которое мне нужно получить как значение, а не 1 + 2 = 3 КБ.

Так что мне нужно реально увидеть, где происходит malloc / free в этом коде, и добавить код для этого, чего я хочу избежать.

1) Так есть ли какие-либо инструменты (бесплатные / лицензированные) для определения размера максимального или общего объема памяти, выделяемого динамически с помощью malloc / realloc?

2) Предоставляет ли MS Visual Studio 2005/2008 что-либо подобное?

спасибо,

-AD

Ответы [ 4 ]

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

Если вы статически связаны с CRT, вы можете «отменить» реализацию malloc, realloc, free (фактически, все функции, которые появляются в malloc.c, realloc, c free.c и / или dbgheap.c ЭЛТ). Это выполнимо, но может потребоваться несколько итераций, прежде чем вы получите полный набор функций, которые должны быть отменены.

Если вы динамически связываетесь с CRT, вы можете переопределить malloc, realloc и free следующим образом:

#define malloc(s)    mymalloc(s)
#define realloc(p,s) myrealloc(p,s)
#define free(p)      myfree(p)

Реализации mymalloc, myrealloc и myfree могут затем просто использовать malloc, realloc и free (не используйте #define в исходном файле, который реализует mymalloc, ...) или вы можете использовать собственные функции Windows.

0 голосов
/ 10 марта 2010

Memory Validator может сделать это.

Есть несколько разных отчетов, которые вы найдете полезными:

  • Итоги. Он представлен в виде диалогового окна и предоставляет текущие, совокупные и общие значения для каждого из основных распределителей памяти (среда выполнения C, HeapAlloc, LocalAlloc, GlobalAlloc, CoTaskMemAlloc и т. Д.).

  • Объекты. Это одна из основных вкладок и отображает тип объекта, размер, количество, накопительный. Также вложенные вкладки для значений по потокам и по dll.

  • Размеры. Это одна из основных вкладок, отображающая размер, количество, накопление. Также вложенные вкладки для значений по потокам и по dll.

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

Полное раскрытие: я являюсь частью команды проверки памяти.

0 голосов
/ 03 марта 2010

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

0 голосов
/ 03 марта 2010

Я бы порекомендовал следующее:

  1. Если у вас есть доступ к исходному коду, который вы хотите проанализировать, замените все вызовы malloc/realloc на вызовы вашей СОБСТВЕННОЙ функции, которая будет выполнять анализ.
  2. Если у вас нет доступа к исходному коду, вы можете использовать библиотеку Detours от Microsoft.Библиотека перехватывает вызовы произвольных функций и перенаправляет их в пользовательскую реализацию.В этой реализации вы можете выполнить анализ и затем вернуться к стандарту malloc/realloc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...