Какие возможности существуют для посмертного анализа в .NET (например,после сбоя программы)?

StackOverflow https://stackoverflow.com/questions/455122

  •  19-08-2019
  •  | 
  •  

Вопрос

Предположим, есть программа на C#, которая используется в качестве службы Windows.Предположим, что служба вышла из строя и как сумасшедшая потребляет процессор и память.Ее нужно очень скоро перезапустить, потому что это производственная система.Поэтому у меня не так много времени для сбора информации о ходе выполнения.Может, бегло заглянуть в диспетчер задач...вот и все.

После этого все, что у меня есть, — это файлы журналов log4net и журнал событий Windows для посмертного анализа.

Предположим, что я выяснил причину проблемы.Кто-то другой это исправляет и, возможно, программист добавляет какое-то дополнительное логирование, чтобы в следующий раз я мог быстрее найти подобную проблему.Тем не менее:Я по-прежнему завишу от качества файлов журналов и надеюсь, что в следующий раз проблема каким-то образом проявится в журналах.

Существуют ли другие способы проведения посмертного анализа?Может быть, что-то вроде дампов потоков (как в Java), дампов памяти или чего-то еще, что может помочь в посмертном анализе?Может быть, поможет какой-нибудь встроенный инструмент .NET framework?

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

Это было полезно?

Решение

Как говорит Марк, WinDbg + SoS позволит вам отладить множество проблем, которые вы не можете решить в Visual Studio. в этом блоге есть несколько отличных учебных пособий .

В случае проблем с памятью вы также можете посмотреть счетчики производительности .NET в Perfmon. Вы можете посмотреть, где находятся объекты (какое поколение) и сколько времени уходит на сборку мусора. Это должно дать вам некоторую полезную информацию. Если вы хотите знать, почему объект не собирается, WinDbg и SoS - это то, что вам нужно. Чтобы провести вас через простую сессию, выполните следующие действия:

<Ол>
  • Проверьте кучу с помощью !dumpheap -stat, найдите большое количество экземпляров. Вы, вероятно, имеете некоторое представление о том, что вы ожидаете найти в куче в любой момент, поэтому, если что-то выходит за рамки обычного, посмотрите на это.

  • Выберите случайный экземпляр и введите !gcroot адрес экземпляра. Это скажет вам, почему объект не собирается.

  • Повторить

  • Вероятные кандидаты на сохранение материала дольше, чем следовало бы: события, статика и очередь финализаторов и многие другие.

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

    Другие советы

    Вы можете создавать аварийные дампы с помощью .NET и просматривать их с помощью windbg / sos (и sosassist). Не просто, но это работает. Но довольно хардкор. Поиск по & Quot; + windbg + .NET & Quot; должно оказаться интересным.

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

    К сожалению, я должен был сделать изрядное количество этого - лучший инструмент, с которым я столкнулся, это cordbg, который поставляется вместе с SDK (вам понадобится правильная версия для вашей версии .net). http://msdn.microsoft.com/en-us/library/a6zb7c8d. aspx для подробностей.

    Присоедините к запущенному процессу в cordbg (a < [pid] >), присоедините к каждому запущенному потоку (t < [tid] >), затем дамп стек для каждого потока (w).

    Автоматизация этой задачи с помощью небольшого vb-скрипта с последующим выводом в файл позволит вам запустить этот инструмент несколько раз, сохраняя вывод в файл. Сравнение всех стеков потоков даст вам очень хорошее представление о том, где ваше приложение тратит свое время.

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

    Отличным ресурсом для посмертного анализа с помощью WinDbg и SOS является Тесс Феррандес. серия записей в блоге на предмет.

    РЕДАКТИРОВАТЬ:Ссылка обновлена

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

    Кроме этого, полный дамп + windbg + SOS дает вам больше информации, но получить ее не тривиально.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top