Как мне запустить профилировщик памяти в наших тестовых проектах? - PullRequest
3 голосов
/ 09 ноября 2011

Все,

Что-то не так с нашим тестовым проектом, генерирующим исключения OOM, и я подозреваю, что проблема в нас.Мы как-то держим ссылки, и память никогда не освобождается.

Итак, я хотел бы запустить профилировщик памяти и посмотреть, где это происходит.

Настройка инструмента профилирования - этодостаточно просто указать инструмент на nunit-console.exe и запустить наш тестовый проект и сделать несколько снимков.

К сожалению, это не работает.Я пробовал и SciTech, и демоверсию ANTS, и оба с радостью сообщают, что консольная сборка NUnit / appdomain / что-либо не растет.Отлично.Процесс в диспетчере задач постоянно растет до 450 МБ, но профилировщики памяти сообщают, что он вообще не вырос.

Отлично.

Я гуглил и видел некоторые (инструментальные) упрощенные инструкции по работе с проектами модульного тестирования.Я пробовал эти вещи, и они не работали.Я попытался поиграть с настройками приложения / сборки NUnit, но пока безрезультатно.

Итак.

Кто-нибудь на самом деле запускал профилировщик памяти для тестового проекта (любогоиспользуйте NUnit, но я бы поспорил, что то же самое для любой среды автоматического тестирования .NET) успешно ?Для каких-либо тестовых рамок .NET?Если да, то какие инструкции сработали у вас?

Ответы [ 4 ]

3 голосов
/ 10 ноября 2011

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

Возможно, вам не потребуется запускать все тесты, чтобы выяснить, что такое утечка.видимый из управляемых инструментов отслеживания памяти.Вам нужно специально искать неуправляемую память.Это часто происходит из-за пропущенных вызовов Dispose ().

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

Я использовал последнюю версию RedGate ANTS (v9.5.0.853), и она правильно (и легко) профилировала мои библиотеки .NET через NUnit (v2.6.2).

Вам необходимо установитьEXE запускается как NUnit exe ... И я нацелился на определенную функцию в моей DLL ("Portal.Interface.dll").

Я создал новый сеанс профиля;

  • Путь к исполняемому файлу .NET: C: \ Program Files (x86) \ NUnit 2.6.2 \ bin \ nunit-x86.exe
  • Аргументы командной строки: Portal.Interface.dll /fixture:Portal.Interface.Tests.TestSerializingSpeed
  • Рабочий каталог:

Затем я запустил его с методом наивысшего профилирования.

Он дал результаты утечкиожидал ...

0 голосов
/ 17 ноября 2011

Вы должны попробовать JetBrains MemoryProfiler (я использую версию 3.5) Отлично работает на NUnit (версия с графическим интерфейсом)!

0 голосов
/ 10 ноября 2011

Убедитесь, что вы рассмотрели все типы распределений, включая неуправляемую память?

Кстати, OutOfMemoryException не обязательно выбрасывается, когда вообще нет свободной памяти. Иногда он генерируется определенными классами, которые хотят выделить большие смежные блоки памяти, например StringBuilder. XmlDocument.SelectNodes иногда выбрасывает его.

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

edit # 1

Возможно, я неправильно помню (вините пиво), но наблюдаемая вами ситуация также может быть объяснена тем фактом, что сборщик мусора сообщает, что он выпустил объекты, но диспетчер памяти ОС не смог полностью освобождая память, ранее занятую. Он даже больше вправе делать то, что чувствует, чем сборщик мусора .NET. Лучшее решение проблемы такого рода - создать вокруг всего, что пытается выделить массивные типы значений, наиболее заметно System.String.

...