Как запустить профилировщик памяти в наших тестовых проектах?

Все,

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

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

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

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

Здорово.

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

So.

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


person Peter Seale    schedule 09.11.2011    source источник


Ответы (4)


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

Возможно, вам не нужно запускать все тесты, чтобы выяснить, в чем заключается утечка.

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

person Vincent Hubert    schedule 09.11.2011
comment
Это крайняя мера, но спасибо за ответ. Мы используем все странные атрибуты, и я не хочу заново реализовывать весь NUnit, но мы уже в отчаянии, так что я могу в конечном итоге сделать это. - person Peter Seale; 16.11.2011
comment
После дополнительных усилий я не уверен, что проблема заключается в использовании его с NUnit. Вы пытались добровольно вставить утечку в свои тесты, чтобы увидеть, сможет ли профилировщик их обнаружить? (просто добавляйте материал в коллекцию между снимками) Возможно, что сами утечки находятся в месте, которое трудно обнаружить с помощью инструментов, и что сложность связана с самой утечкой, а не с инструментом. IIRC, последняя вкладка в профилировщике дает статистику по всему процессу. Однажды у меня была утечка, связанная с ADO .net, когда запрос приводил к утечке нескольких K в неуправляемой памяти после каждого вызова. - person Vincent Hubert; 18.11.2011
comment
Нет, он явно не показывает никаких данных самих тестов. Я последовал вашему совету и создал консольный проект Питера NUnit, вчера провел несколько наших тестов и думаю, что нашел утечку. Мне просто любопытно, почему только я профилирую тестовые проекты. #вероятно,что-то делатьне следует - person Peter Seale; 19.11.2011

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

person 6opuc    schedule 17.11.2011
comment
Пробовал, и это не сработало. Профилировщик производительности работает. - person Peter Seale; 18.11.2011

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

Вам нужно настроить запуск EXE как исполняемого файла NUnit... И я нацелился на определенную функцию в моей 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
  • Рабочий каталог:

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

Это дало результаты утечки, которые я ожидал...

person James Joyce    schedule 26.10.2016

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

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

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

изменить №1

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

person Tom W    schedule 09.11.2011
comment
Downvoters - пожалуйста, имейте приличие, чтобы объяснить, почему. Я лично сталкивался с проблемами, подобными описанным, и основной причиной является то, что я упомянул в своем посте. - person Tom W; 16.11.2011
comment
Проголосовал против, потому что сегодня это не помогает мне с моей проблемой. Это может быть ответом на чей-то вопрос, но он не говорит мне, как запустить профилировщик для тестового проекта. - person Peter Seale; 16.11.2011
comment
Я думал, что объяснил себя достаточно хорошо - я говорю, что я подозреваю, что вы не найдете то, что ищете, профилируя тестовый проект. Вопрос заключается в том, как профилировать тестовый проект, но проблема, с которой вы начинаете вопрос, заключается в исключении OutOfMemoryException. Если это проблема, которую я описал, профилирование ее не найдет. - person Tom W; 17.11.2011