Как решить утечку личных байтов (родной памяти)? - PullRequest
8 голосов
/ 26 октября 2011

Я разрабатываю приложение на C #, в котором, похоже, есть утечка. Я использовал профилировщик памяти и обнаружил, что мой

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

Теперь я застрял, как я могу найти утечки памяти в нативном коде?

Ответы [ 5 ]

4 голосов
/ 26 октября 2011

Во-первых, если у вас есть дамп процесса утечки, вы можете открыть его в WinDbg и выполнить команду:! Address -summary

  • , если RegionUsageHeap большой, то он должен быть собственнымутечка памяти
  • если RegionUsageIsVAD, то это должна быть утечка памяти .NET.

Если это собственная утечка, то у вас есть 2 варианта:

  • Использовать DebugDiag: при появлении запроса выберите «Собственная утечка памяти и Обработка утечки», выберите процесс, который вы хотите диагностировать, и начинайте работу с приложением, пока не начнете экспериментировать с утечкой памяти.После завершения создайте полный дамп приложения (щелкните правой кнопкой мыши правило утечки и выберите «Полный дамп пользователя»).Затем вы можете проанализировать сгенерированный дамп (вам нужно правильно настроить символы, чтобы он работал эффективно): на вкладке «расширенный анализ» выберите «Анализаторы давления памяти», откройте файл дампа и нажмите «Начать анализ».Это создает и HTML-отчет, который вы можете проанализировать.Вы можете обратиться к этой странице для подробного ознакомления.

  • Используйте Application Verifier / WinDbg.В верификаторе приложения выберите ваше приложение (.exe).На странице тестов убедитесь, что выбраны Основы / Кучи.На нижней панели убедитесь, что для параметра «Traces» установлено значение true.После сохранения конфигурации перезапустите приложение и создайте полный дамп при возникновении утечки.Не забудьте очистить флаги приложения после создания дампа.Затем вы можете открыть дамп из WinDbg и исследовать утечку с помощью команды '! Heap'.В частности, '! Heap -l' предоставит вам список пропущенных блоков, '! Heap -p -a' покажет детали блока, включая стек вызовов выделения.

Если это утечка .NET, существуют сторонние инструменты для ее устранения.Начиная с версии 1.2, DebugDiag также позволяет выполнять анализ утечек памяти .NET (однако никогда не пробовал).

3 голосов
/ 26 октября 2011

Диагностика утечек памяти в управляемом приложении (по крайней мере на начальном этапе) очень похожа на диагностику утечек памяти в любом другом приложении.

Способ, которым я обычно подхожу к этим проблемам, состоит в том, чтобы заставить процесс утекать большой объем памяти, взять полный дамп процесса, а затем изучить дамп, чтобы увидеть, что использует больше всего памяти. Например, если ваш процесс имеет нормальные / начальные личные байты ~ 20 МБ, но вы можете заставить свой процесс утекать память до тех пор, пока у него не будет ~ 200 МБ частных байтов, тогда есть большая вероятность, что ~ 180 МБ этой памяти будет утечка - вообще там, где больше всего выделено памяти, вы должны искать.

У Microsoft есть очень полезный инструмент под названием DebugDiag - изначально разработанный для использования при диагностике утечек памяти в IIS, это очень универсальный инструмент, который очень удобен при работе с проблемами памяти. Если вы дадите ему аварийный дамп, он проведет некоторый анализ и должен (по крайней мере) сказать вам, какой модуль выделил всю эту память, тогда вы можете начать более конкретно смотреть на то, как этот модуль используется.

0 голосов
/ 26 октября 2011

Обычно у меня были лучшие результаты при поиске утечек памяти с помощью ANTS Memory Profiler .

( или других инструментов , лично у меня были лучшие впечатления от ANTS)

0 голосов
/ 26 октября 2011

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

0 голосов
/ 26 октября 2011

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

Если вы можетеЕсли вы опубликуете название библиотеки и ваш исходный код (а также сигнатуры собственных методов), мы можем дать вам более конкретный совет.

...