Хабрахабр

[Перевод] Инструментарий для анализа и отладки .NET приложений

Этот пост родился из твита, и я должен поблагодарить всех, кто помог составить список подходящих инструментов. Заглянуть «под капот» кода или посмотреть на внутреннее устройство CLR можно с помощью множества инструментов. Если я пропустил какие-то из них, напишите в комментариях.

Также существует множество хороших (коммерческих) профилировщиков . Во-первых, я должен упомянуть, что хороший отладчик уже присутствует в Visual Studio и VSCode. Например, недавно я попробовал поработать с Codetrack и был впечатлён его возможностями. NET и инструментов мониторинга приложений, на которые стоит взглянуть.

Все инструменты имеют открытый исходный код. Однако оставшийся пост посвящён инструментам для выполнения отдельных задач, которые позволят лучше понять, что происходит.

PerfView от Вэнса Моррисона

Он работает на основе трассировки событий Windows (ETW) и позволяет лучше понять, что происходит внутри CLR, а также даёт возможность получить профиль использования памяти и центрального процессора. PerfView – великолепный инструмент, который я использую уже несколько лет. Чтобы освоить инструмент, придётся впитать много информации, например с помощью обучающих видео, но это стоит потраченного времени и усилий.

Diagnostics. Инструмент настолько полезен, что сами инженеры Microsoft используют его, а многие из недавних улучшений производительности в MSBuild появились после анализа узких мест с помощью PerfView.
Инструмент создан на базе библиотеки Microsoft. TraceEvent library, которую можно использовать для создания собственных инструментов. Tracing. Кроме того, поскольку исходный код библиотеки является открытым, в ней благодаря сообществу появилось множество полезных функций, например графики flame-graphs:

SharpLab от Андрея Щёкина

SharpLab появился как инструмент для проверки IL-кода, генерируемого компилятором Roslyn, и со временем превратился в нечто большее:

NET, в которой отображаются промежуточные шаги и результаты компиляции кода. SharpLab – интерактивная среда для запуска кода . С помощью SharpLab вы увидите код, как его видит компилятор и лучше поймёте суть языков . Некоторые функции языка – всего лишь обёртки для других, например using() становится try/catch. NET.

Инструмент поддерживает C#, Visual Basic и F#, но самыми интересными функциями в нём являются Decompilation/Disassembly:
Функции декомпиляции/дизассемблирования можно использовать для:

  1. C#
  2. Visual Basic
  3. IL
  4. JIT Asm (нативный Asm Code)

NET JIT генерирует из вашего кода C#: Вы правильно поняли: инструмент выводит код ассемблера, который .

Object Layout Inspector от Сергея Теплякова

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

Но знания о структуре могут быть полезны, если вы работаете над быстродействующим приложением.
Как можно изучить структуру? Официальной документации, которая бы описывала структуру полей, не существует, поскольку авторы CLR оставили за собой право изменить её в будущем. Оба подхода требуют много усилий, поэтому мы создадим инструмент, который будет выводить структуру объекта во время выполнения. Можно посмотреть на необработанную память в Visual Studio или использовать команду !dumpobj в SOS Debugging Extension.

Print<NotAlignedStruct>() с подобным кодом: Согласно примеру в репозитории GitHub, если вы используете TypeLayout.

public struct NotAlignedStruct
{ public byte m_byte1; public int m_int; public byte m_byte2; public short m_short;
}

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

Size: 12. Paddings: 4 (%33 of empty space)
|================================|
| 0: Byte m_byte1 (1 byte) |
|--------------------------------|
| 1-3: padding (3 bytes) |
|--------------------------------|
| 4-7: Int32 m_int (4 bytes) |
|--------------------------------|
| 8: Byte m_byte2 (1 byte) |
|--------------------------------|
| 9: padding (1 byte) |
|--------------------------------|
| 10-11: Int16 m_short (2 bytes) |
|================================|

The Ultimate .NET Experiment (TUNE) от Конрада Кокосы

Он поможет изучить внутреннее устройство . Как сказано на странице GitHub, TUNE – многообещающий инструмент. NET и способы повышения производительности с помощью экспериментов с кодом C#.

Подробную информацию о нём можно узнать из этого поста, но на высоком уровне он функционирует следующим образом:

  • напишите работающий пример кода на C#, который содержит хотя бы один класс с публичным методом, принимающим один строковый параметр. Код запускается с помощью кнопки Run. Вы можете включить любое количество методов и классов. Но помните, что первый публичный метод из первого публичного класса будет выполнен с использованием первого параметра из окна ввода под кодом;
  • нажмите кнопку Run, чтобы скомпилировать и выполнить код. Кроме того, он будет компилирован в IL-код и код ассемблера в соответствующих вкладках;
  • пока Tune работает (в том числе во время выполнения кода), инструмент строит график, отображающий данные сборщика мусора. Он содержит информацию о размерах поколений и сеансах сбора мусора (представлены в виде вертикальных линий с числом внизу, которое указывает на то, в каком поколении выполняется сборка мусора).

Выглядит это следующим образом:

Инструменты на базе CLR Memory Diagnostics (ClrMD)

С момента выхода . Наконец, давайте взглянем на определённую категорию инструментов. NET. NET разработчики всегда могли использовать WinDBG и SOS Debugging Extension, чтобы посмотреть, что происходит в среде выполнения . Однако, это не самые простые инструменты для первого знакомства и, как сказано в следующем твите, не всегда самые продуктивные:

Diagnostics. К счастью, Microsoft сделал доступной библиотеку ClrMD (также известную, как Microsoft. NET. Runtime), и теперь любой может создать инструмент для анализа дампов памяти программ . Я также рекомендую взглянуть на ClrMD. Подробную информацию можно прочитать в официальном блоге. Extensions, которые “… обеспечивают интеграцию с LINPad и делают использование ClrMD ещё проще”.

Напоминалочка самому себе: осторожнее с твитами. Я хотел собрать список всех существующих инструментов и призвал на помощь твиттер. Менеджер, ответственный за WinDBG, может прочитать их и расстроиться!

Но при желании можно использовать COM-интерфейсы напрямую. Большинство этих инструментов работают на базе ClrMD, потому что так проще всего. Описание кроссплатформенных вариантов можно найти в Analyzing a . Также нужно заметить, что любой инструмент на базе ClrMD не является кроссплатформенным, поскольку сама ClrMD предназначена только для Windows. NET Core Core Dump on Linux.

Наконец, чтобы как-то соблюсти баланс, недавно появилась улучшенная версия WinDBG, которой сразу же попытались добавить функциональность:

После всех этих слов переходим к списку:

  • SuperDump (GitHub)
    • Средство для автоматического анализа аварийного дампа (презентация)
  • msos (GitHub)
    • Среда с интерфейсом командной строки типа WinDbg для выполнения SOS-команд при отсутствии SOS.
  • MemoScope.Net (GitHub)
    • Инструмент для анализа памяти процесса в .NET. Можно сделать дамп памяти приложения в файл и прочитать его позже.
    • Файл содержит все данные (объекты) и информацию о тредах (состояние, стек, стек вызовов). MemoScope.Net проанализирует данные и поможет найти утечки памяти и взаимные блокировки.
  • dnSpy (GitHub)
    • Отладчик и редактор сборок .NET
    • Его можно использовать для редактирования и отладки сборок, даже если у вас нет исходного кода.
  • MemAnalyzer (GitHub)
    • Инструмент анализа памяти для управляемого кода. Присутствует интерфейс командной строки.
    • Подобно !DumpHeap в Windbg может определить, какие объекты занимают больше всего места в куче без необходимости устанавливать отладчик.
  • DumpMiner (GitHub)
    • Инструмент с графическим интерфейсом для работы с ClrMD. Больше возможностей появится в будущем.
  • Trace CLI (GitHub)
    • Инструмент для отладки и отслеживания во время эксплуатации
  • Shed (GitHub)
    • Shed – приложение, которое анализирует выполнение программы в .NET. Его можно использовать для анализа вредоносного ПО, чтобы получить данные о том, какая информация сохраняется, при запуске такого ПО. Shed может:
    • извлекать все объекты, хранящиеся в управляемой куче;
    • выводить строки, хранящиеся в памяти;
    • создавать моментальный снимок кучи в формате JSON для последующей обработки;
    • делать дамп всех модулей, загруженных в память.

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

Другие инструменты

Стоит упомянуть и другие инструменты:

  • DebugDiag
    • Инструмент DebugDiag создан для устранения таких проблем, как зависания, низкая производительность, утечки памяти или её фрагментация, а также отказы процессов, выполняющихся в пользовательском режиме (теперь с интеграцией CLRMD).
  • SOSEX (возможно больше не разрабатывается)
    • … расширение для отладки управляемого кода, которое снижает моё недовольство SOS.
  • VMMap от Sysinternals
    • VMMap – средство для анализа виртуальной и физической памяти процессов.
    • Я применял его, чтобы проанализировать использование памяти в CLR
Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть