12 Инструменти за отстраняване на грешки
Някои от тях са относително прости, други ще отнеме време и усилия за овладяване. Под раздела ще намерите кратък преглед на 12 инструмента, които ще бъдат полезни за инженерите по производителност, специалистите по поддръжка от най-високо ниво и разработчиците като цяло, които се грижат за производителността на своите приложения.

Typeperf и Perfmon
Броячите на производителност на Windows са първата стъпка към получаване на общ преглед на високо ниво на това, което прави вашата система. Мониторингът на използването на процесора и паметта, диска и I/O, мрежовите пакети и HTTP заявките ви позволява да получите изглед от птичи поглед на производителността на системата с малки допълнителни разходи и да разберете къде да копаете по-нататък.Perfmon (Монитор на производителността)е вграден инструмент на Windows, който не само осигурява достъп до панел за брояч на производителността в реално време, но също така ви позволява да записвате данни от брояча, за да ги видите по-късно на друг компютър, и дори да настроите автоматични известия, в случай че нещо се обърка. За любителите на командния ред имаTypeperf, инструмент, който записва данни от брояча в CSV файл, който след това може лесно да бъде анализиран и автоматично анализиран. Тези два инструмента ви позволяват бързо да разберете какво да търсите първо и дали вашата система работи правилно. Те обаче, разбира се, не са подходящи за задълбочено изследване, тъй като броячите просто ви показват числа, които отразяват определени аспекти на работата на операционната система.
- Typeperfдокументация в TechNet
- Документация на Perfmon в TechNet

XPerf, WPR и WPA (Windows Performance Toolkit)
През последните 10 годиниETW (Проследяване на събития за Windows)се превърна в много разпространен инструмент и стана де факто стандарт сред инструментите за анализ на ефективността на Windows. Като записвате и анализирате ETW данни, можете да профилирате процесора на ниво ОС, да изследвате заключванията, да разберете кои части от вашето приложение причиняват високо натоварване на диска или мрежата и дори да наблюдавате събирането на отпадъци, разпределението на паметта и събитията за зареждане на асемблиране на самата NET.XPerfе по-стар конзолен инструмент за записване на ETW събития, който има няколко аналитични модула за измерване на входно/изходната производителност, отчитане на активността на процесора и изчисляване на „разходите“ за работещи приложения. Освен това, той може да конвертира ETW записи в CSV формат, който може лесно да бъде анализиран от други инструменти и скриптове.WPR (Windows Performance Recorder)е GUI, който ви позволява да изберете събитията, които искате да запишете.
Като цяло, ETW инструментите са чудесни за производствен анализ, въпреки че могат да се използват и при разработка. Основният недостатък на тези решения е относителното неудобство при използването им в сравнение с комерсиалните профайлери.

Основният проблем с Windows Performance Toolkit е, че той не е проектиран да наблюдава управлявани процеси и специфични за CLR събития като събиране на отпадъци, управлявани изключения, зареждане на асемблиране или JIT компилация.PerfViewе инструмент с отворен код от Microsoft, който може да улавя, събира и показва CLR събития, включително тези, които виеинициирайте го сами, като използвате EventSource API, наличен от .NET 3.5. PerfView има няколко уникални функции: например, показване на дъмпове на куп управлявани процеси по много удобен начин (което прави много лесно откриването на изтичане на памет); свиване и групиране на стекове за повиквания, което ви позволява бързо да се справяте с хиляди точки от данни и събиране на данни за .NET събития като GC и разпределения. За съжаление интерфейсът PerfView е направен от инженер по производителност, така че не е много интуитивен и изисква известен период на свикване, след който ще можете да работите с инструмента на 100%.
Etrace и LiveStacks
НаDotNext 2017 PiterСаша ще представи няколко свои собствени разработки с отворен код, които самият той използва за изследване на ефективността „лице в лице“ и които не изискват генериране на големи количества данни и техния последващ анализ. Първият от тях еetrace, който генерира дневник на живо с интересни ETW събития и предоставя много опции за филтрирането им. Например, можете да поискате от etrace да отпечата съобщение, когато се използва конкретен файл, когато в процеса се появи събиране на боклук от поколение 2, когато се зареди конкретен .NET асембли, или когато ASP.NET приложение хвърли управлявано изключение. Работата от командния ред ви позволява да използвате etrace в скриптове и бързо да получавате резултати, без да се ровите в GUI.
Вторият инструмент еLiveStacks, инструмент, подобен на профайлър, предназначен да улавя и обединява стекове от събития в реално време. По-конкретно, LiveStacks събира управлявани стекове за повиквания (имена на методи), като изследва паметта на целевия процес, за разлика от традиционния ETW подход, който изисква края на сесията за профилиране, за да генерира и анализираCLR rundown събития. Резултатът от този подход е бърз, лек и ефективен инструмент, който може да поддържа стека в компактна форма, подходяща за формиране на пламъчна графика. Ако имате нужда от бързи резултати в производството и не се колебайте да работите в конзолата, надявам се тези инструменти да са ви полезни.
- etrace GitHub хранилище
- LiveStacks GitHub хранилище

Procdump и DebugDiag
Описаните по-горе инструменти са насочени основно към оптимизиране на производителността, въпреки че със същия ETW хванах много грешки и течове на памет. В някои случаи обаче може да се нуждаете от пълен дъмп на паметта на счупения процес, който може да бъде прегледан в производствена система или по-късно във вашата среда за разработка. Windows има няколко инструмента за дъмпинг, тук ще говорим за два от тях:Procdump, много гъвкаво безплатно конзолно приложение от Sysinternals, което генерира дъмпове за различни тригери (% използване на процесора, използвана памет, неотговарящи прозорци и т.н.); иDebugDiag, инструмент за наблюдение, който може да бъде много фино настроен, за да наблюдава вашите процеси във фонов режим за проблеми. Има много грешки, които могат да бъдат открити само чрез изследване на дъмп или дори няколко дъмпа, направени на определена честота, така че създаването на инфраструктура за получаване на такива дъмпове може да бъде задача номер едно.
По принцип можете да използвате Visual Studio, за да анализирате дъмпове и да получите най-много информация от тях, но е по-добре да обърнете внимание на WinDbg и неговите различни разширения.WinDbg, Windows Debugger, е мощен и много недружелюбен инструмент за отстраняване на грешки в работещи процеси и анализиране на дъмпове. въоръженразширения (като SOS, SOSEX, NetExt и MEX), вие получавате много мощност: изследвайте управляваната купчина, намирайте неизползвани и непремахваеми обекти, намирайте блокирани потоци с една команда, откривайте ASP.NET заявки в реално време и правете много други проучвания. Важно е да се отбележи, че WinDbg може да се управлява както от външни скриптове (като се изпълнява от командния ред с определени параметри), така и от вътрешни (написани на скриптови езици или C/C++/C# DLL). Всичко това дава много по-гъвкави опции за отстраняване на грешки от VS или други IDE, а неговата лекота ви позволява да го поставите в производство и да го използвате за наблюдение в реално време. Повярвайте ми, ще оцените тази възможност да не копирате дъмп от 50 гигабайта за себе си, когато се окаже, че вашият сървър се намира на 5000 километра от вас и честотната лента не надвишава 1 мегабит в секунда.
Между другото, в миналото DotNext Саша вече разказа много интересни неща за WinDbg.

Този списък би бил непълен, ако не беше друго приложение (което Саша написа сам), предназначено да реши един много досаден проблем с анализа на дъмпа: имах файлове с Windows Phone и няма публично SOS разширение за WinPhone CLR, което е толкова необходимо за всякакъв вид управляван дъмп анализ в WinDbg. Затова написах собствен дебъгер с отворен код, базиран на API за отстраняване на грешки на Windows (DbgEng) и библиотеката CLRMD на Microsoft.Msosе рамка с отворен код, която предоставя управлявана обвивка за SOS интерфейси. С течение на времето msos придоби уникални характеристики, които го отделиха от WinDbg и SOS:
- Заявки за избор на обекти от купчината, например „Намиране на всички HTTP заявки, които чакат повече от 2 секунди“ или „намиране на всички обекти от тип CustomerData, където параметърът AmountDue е отрицателен“;
- Откриване на блокиране в управлявани и нативни механизми за синхронизация;
- Поддръжка на индексиране на купчина за бързо обхождане на графика;
- Персонализиран генератор на дъмп памет, който игнорира региони на паметта, които не са необходими за анализ на управляван дъмп (като по този начин спестява до 80% от дисковото пространство);
- Автоматичен режим на сортиране, който генерира кратък JSON отчет с минимум данни, необходими за по-задълбочено проучване. Разбирам, че повечето от вас ще продължат да използват VS за ежедневно отстраняване на грешки и това е добре. Моят инструмент обаче ще ви позволи да се справите с най-неприятните ситуации.
И ако не искате да посветите целия ден на отстраняване на грешки и производителност, тогава можете да се срещнете със Саша и 30 други .NET гурута от цял свят наDotNext 2017 Piter.
UPD. Отново тренираме със Саша, този път в Москва: условията за регистрация и участие сана уебсайта.