Как определить, какие объекты C / C ++ используют больше всего памяти - PullRequest
3 голосов
/ 27 октября 2009

У меня есть приложение в смешанном режиме (управляемое и собственное), занимающее много места в памяти. Я уже выяснил, что большая часть памяти выделяется собственным кодом. Я не говорю об утечке памяти, но о большом потреблении памяти, которое происходит очень рано после запуска программы и затем относительно стабильно.

Вам известен какой-либо инструмент, который показывает, какие объекты C / C ++ используют больше всего памяти? Я уже пробовал DebugDiag 1.1 и SoftwareVerify's Memory Validator, но оба инструмента не дают достаточно информации для идентификации объектов C / C ++.

Привет

Frank

Ответы [ 2 ]

2 голосов
/ 07 ноября 2009

Могу ли я предложить более "хардкорный" подход?

Команда WinDbg's! Heap может раскрыть много важной информации о собственной куче. Начните с выполнения следующих шагов:

A. запустите GFlags, перейдите на вкладку «Файл изображения», введите имя вашего процесса и нажмите вкладку.

B. нажмите «Включить кучу страниц» и «Создать базу данных трассировки стека в режиме пользователя» и нажмите ОК.

C. начать свой процесс.

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

ВАЖНО: сбор этой информации заставит ваше приложение использовать больше памяти и, вероятно, будет медленнее. Windows будет продолжать собирать эту информацию каждый раз, когда вы запустите ваш процесс, пока вы не скажете иначе, запустив GFlags и удалив ваши выборы.

присоедините WinDbg к вашему приложению и установите правильные символы. кроме ваших собственных символов вам понадобятся символы Microsoft. используйте команду .symfix, а затем используйте .reload / f, чтобы WinDbg загрузил правильные символы с сервера символов Microsoft (это может занять несколько минут).

После того, как все символы установлены, выполните следующие шаги:

A. ! heap -stat - увидеть суммарное использование всех куч вашего процесса

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

C. ! heap -stat -h "дескриптор кучи" - чтобы увидеть статистику выделения кучи. в выводе вы найдете, сколько блоков выделено для каждого размера выделения.

D. выберите один из более высоких размеров выделения и используйте! heap -flt s "size", чтобы вывести все записи кучи одинакового размера.

E. ! heap -p -a "UserPtr" напечатает стек размещения (вместе с другой информацией). эта информация будет недоступна, если вы не установите «Включить кучу страниц» с помощью GFlags.

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

B.T.W

Если у вас еще не установлен пакет средств отладки для Windows, вы можете загрузить его с здесь .

Может быть, этот подход не так прост, как вы ожидали, но он работает :) Повеселись.

2 голосов
/ 27 октября 2009

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

...