Поделиться через


Отладка дампа управляемой памяти с помощью анализаторов диагностики .NET

При работе с этим руководством вы сделаете следующее:

  • откроете дамп памяти;
  • Выбор и выполнение анализаторов для дампа
  • Просмотр результатов анализатора
  • перейдете к проблемному коду.

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

Открытие дампа памяти в Visual Studio

  1. Откройте дамп памяти в Visual Studio с помощью команды меню Файл > Открыть > Файл и выберите дамп памяти.

  2. Обратите внимание, что на странице сводки дампа памяти в разделе Действие отображается пункт Выполнить диагностический анализ.

    Action - Diagnostics Analysis

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

Выбор и выполнение анализаторов для дампа

Для изучения этих симптомов в разделе Скорость реагирования процесса доступны варианты, которые наиболее точно соответствуют проблеме в нашем примере.

Select diagnostics analyzers

  1. Нажмите кнопку Анализ, чтобы запустить процесс.

  2. Анализатор представит результаты на основе сведений о процессе и данных CLR, полученных в дампе памяти.

Просмотр результатов анализатора

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

    Diagnostics analyzers results

  2. В разделе Сводка анализа указано, что пул потоков CLR испытывает нехватку ресурсов. Согласно этой информации предполагается, что среда CLR использовала все доступные потоки пула потоков. Это означает, что служба не сможет отвечать на новые запросы, пока поток не будет освобожден.

    Примечание.

    Исправление в нашем примере — это рекомендация не выполнять синхронное ожидание мониторов, событий, задач или других объектов, которые могут блокировать поток, и проверить, можно ли обновить метод как асинхронный.

Следующим заданием является поиск проблемного кода.

  1. Когда вы щелкнете ссылку Показать стек вызовов, Visual Studio немедленно переключится на потоки, которые демонстрируют это поведение.

  2. В окне Стек вызовов отобразятся методы, которые могут быстро отличить пользовательский код (SyncOverAsyncExmple.) от кода платформы (System.).

    Diagnostics analyzers link to call stack

  3. Каждый кадр стека вызовов соответствует методу. Когда вы дважды щелкнете кадр стека, Visual Studio перейдет к коду, выполнение которого приводит непосредственно к описанному сценарию в этом потоке.

  4. В нашем примере нет символов или кода, но на странице Символы не загружены можно выбрать вариант Декомпилировать исходный код.

    Decompilation

  5. В декомпилированном источнике ниже асинхронная задача (ConsumeThreadPoolThread) вызывает синхронную блокирующую функцию.

    Примечание.

    Метод DoSomething() содержит метод WaitHandle.WaitOne, который блокирует текущий поток пула потоков до получения сигнала.

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

    Analyze decompiled code