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


У меня есть служба .NET с обычным частным рабочим набором около 80 МБ. Во время недавнего нагрузочного теста процесс достиг 3,5 ГБ памяти, что привело к тому, что вся машина была с низким уровнем физической памяти (3,9 из 4 ГБ), и память не была выпущена долго после того, как нагрузочный тест был остановлен. Используя диспетчер задач, я взял файл дампа процесса и открыл его в Visual Studio 2010 SP1, и я могу начать отладку на нем.

Как диагностировать проблему с памятью? У меня есть dotTrace Memory 3.x в моем распоряжении, поддерживает ли он профилирование памяти в файлах дампа? Если нет, будут ли функции профилирования памяти Visual Studio 2010 Premium help (у меня в настоящее время есть Professional)? Может WinDbg помочь?

обновление: новая Visual Studio 2013 Ultimate теперь можно самостоятельно диагностировать проблемы с памятью с помощью файлов дампа. Смотрите этот блог для более подробной информации.

4 64

4 ответа:

Установить WinDbg. Вы должны убедиться, что вы получите правильную версию x86 или x64 в зависимости от вашей свалки. Вот прямая ссылка на скачать для x86.

на этом, вам нужно убедиться, что вы взяли правильный дамп. Вы можете использовать Диспетчер задач для создания файла дампа (щелкните правой кнопкой мыши на процесс -> создать файл дампа). Если вы находитесь на 64bit и ваш процесс x86 использовать 32-битную версию диспетчера задач (C:\Windows\SysWOW64\taskmgr.exe), чтобы взять файл дампа. Смотрите мой статья для получения дополнительной информации о принятии файлов дампа, например, если вы находитесь на XP и нужно использовать windbg для создания файла дампа.

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

Я предполагаю, что вы используете .NET4, учитывая, что вы можете открыть дамп в Visual Studio. Вот это очень краткое руководство по работе с файлом dmp:

1) Запустите WinDbg, установите путь символов (файл - > путь поиска символов) к

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

2) Откройте аварийный дамп или перетащить .DMP файл на WinDbg.

3)Введите это в окне командной строки

.loadby sos clr

(FYI, для .NET 2, команда должна быть .loadby sos mscorwks)

4) Затем введите этот

!dumpheap -stat

, которые перечислены типы объектов и их количество. выглядит примерно так:

enter image description here

вам придется проанализировать это в контексте вашего приложение и посмотреть, если что-то кажется необычным.

здесь много больше к windbg, google ваш друг.

как правило, если у вас есть утечка в управляемом приложении, это означает, что что-то не собираются. Общие источники включают

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

  • статика

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

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

для устранения неполадок необходимо проверить управляемую кучу. WinDbg + SOS (или PSSCOR) позволит вам сделать это. Элемент !dumpheap -stat команда перечисляет всю управляемую кучу.

вы должны иметь представление о количестве экземпляров каждого типа ожидайте на куче. Как только вы найдете то, что выглядит странно, вы можете использовать !dumpheap -mt <METHOD TABLE> команда для перечисления всех экземпляров данного типа.

следующим шагом является анализ корня этих экземпляров. Выберите один наугад и сделать !gcroot об этом. Это покажет, как этот конкретный экземпляр корнями. Ищите обработчики событий и закрепленные объекты (обычно представляют статические ссылки). Если вы видите очередь финализатора там, вам нужно изучить, что делает поток финализатора. Используйте !threads и !clrstack команды для этого.

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

другие источники утечек включают: сборки, которые не выгружаются и фрагментацию кучи больших объектов. SOS / PSSCOR может помочь вам найти их, а также, но я пропущу детали на данный момент.

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

если у вас есть возможность отладки процесса во время его выполнения, я рекомендую использовать PSSCOR вместо SOS. PSSCOR-это, по сути, частная ветвь источников SOS, которая была улучшена с помощью дополнительных команд, и многие из существующих команд SOS также были улучшены. Например, версия PSSCOR элемент !dumpheap команда имеет очень полезный Дельта-столбец,что значительно упрощает устранение утечек памяти.

для того чтобы использовать его вам нужно начать ваш процесс, прикрепить WinDbg и нагрузить PSSCOR и сделать !dumpheap -stat. Тогда процесс опять запущен так выделяются. Прервите выполнение и повторите команду. Теперь PSSCOR покажет вам количество экземпляров, которые были добавлены / удалены с момента предыдущей проверки.

начиная с версии 2017.2 JetBrains dotMemory поддерживает анализ дампов памяти Windows со всей своей мощью и причудливым графическим интерфейсом.

http://msdn.microsoft.com/en-us/library/ee817660.aspx

У Microsoft есть руководство ЗДЕСЬ. Однако это слишком сложно для новичков.

dotTrace может генерировать диаграммы визуальной памяти (лучше, чем WinDbg), но никогда не использовать его для дампов.