Доклад с митапа MSK .NET Community (http://mskdotnet.org).
Поговорим о самом мощном отладчике для Windows – WinDbg. Разберем как начать использовать этот отладчик, чем он может быть полезен для .NET разработчиков. Подробней остановимся на практических моментах его применения, зачем он прикладным программистам, web-разработчикам. Посмотрим и на другие инструменты отладки, которые занимают нишу между интуитивно управляемым комбайном Visual Studio и легким, но крайне аскетичным WinDbg.
2. Обо мне
Консультант, Upwork’er,
Разработчик проекта IntelliDebugger http://intelliegg.com
Координатор сообществ .NET программистов Москвы и
Санкт-Петербурга http://mskdotnet.org/ http://spbdotnet.org
В прошлом менеджер по продуктам и тимлид в Cezurity,
Acronis, Luxoft, Boeing
3. Зачем WinDbg мне?
Какой отладчик использовать, если
нужно отлаживать расширение
отладчика Visual Studio,
отлаживающего другой процесс?
6. Плюсы WinDbg
Легкий отладчик, быстро запускается
Предоставляет больше данных для анализа
Гибкая и автоматизируемая скриптами отладка кода
Вменяемый анализ дампов
Вменяемая отладка смешанного (mixed) кода
7. Минусы WinDbg
Командная строка - долго не используешь, быстро забываешь
Ужасный GUI
Имеет странности
12. Отладочные символы
0:000> .sympath+ c:mysymbols
Symbol search path is: c:mysymbols
0:000> .reload
Reloading current modules
....
*** ERROR: Symbol file could not be found. Defaulted
to export symbols for ntdll.dll
0:000> .symfix
14. Отображение переменных
0:000> dx /?
DX [-r[#]] <expr> - display C++ expression using
extension model (e.g.: NatVis)
DX [-r[#]] <expr>[,<FormatSpecifier>] - display C++
expression using extension model (e.g.: NatVis) in a
specified format
https://msdn.microsoft.com/en-
us/library/windows/hardware/dn936815(v=vs.85).aspx
15. Отображение переменных
> cd "C:Program Files (x86)Windows Kits10
Debuggersx86"
> mklink /d Visualizers "C:Program Files (x86)
Microsoft Visual Studio 14.0Common7Packages
DebuggerVisualizers“
16. Расширения для отладки .NET кода
SOS http://bit.ly/1PUofK9
SOSEX http://www.stevestechspot.com/
NetExt http://netext.codeplex.com/
PSSCOR2/PSSCOR4 http://bit.ly/1kOJLEV; http://bit.ly/1NKan0G
SDbgExt2 https://github.com/steveniemitz/SDbgExt2
33. Исследование объектов в памяти
0:000> !DumpObj 0x01c56bec
Name: Bar.App
MethodTable: 002130b0
EEClass: 00211240
Size: 20(0x14) bytes (C:samplesBar.exe)
...
34. Исследование объектов в памяти
!DumpVC <MethodTable address> <Address>
!DumpArray [-start <startIndex>] [-length <length>]
[-details] [-nofields] <Array object address>
35. Исследование объектов в памяти
0:000>!mdt 02772f90 -r
02772f90 (Demo.Bar)
array:02772ff8 (System.Int32[], Elements: 4)
list:02773038 (.List`1[[System.String, mscorlib]])
_items:0277305c (System.String[], Elements: 4)
_size:0x2 (System.Int32)
_version:0x2 (System.Int32)
_syncRoot:NULL (System.Object)
<CurrentPoint>k__BackingField:(Demo.Point) VALTYPE
36. Исследование объектов в памяти
!DumpHeap [-stat] [-strings] [-short] [-min <size>]
[-max <size>] [-thinlock] [-startAtLowerBound] [-mt
<MethodTable address>] [-type <partial type
name>][start [end]]
!DumpRuntimeTypes
!strings
!EEHeap [-gc] [-loader]
!TraverseHeap [-xml] <filename>
!VerifyHeap
37. Исследование объектов в памяти
0:006> !HeapStat -iu
Heap Gen0 Gen1 Gen2 LOH
Heap0 188636 6297752 256636732 17592
Free space:
Heap0 12 116 6916 80
Unrooted objects:
Heap0 170476 6297584 256616572 0
38. Исследование объектов в памяти
!GCRoot [-nostacks] <Object address>
!gcgen <hexObjectAddr>
!dumpgen <intGenNum> [-free] [-stat] [-type
<TYPE_NAME>] [-nostrings]
40. Отладка web-приложений
!whttp – список HttpContext обектов
!wservice – список WCF service обектов
!wsocket – информация о сокетах
!DumpASPNetRequests – список потоков с HttpContext
!DumpSqlConnectionPools – информация о всех Sql
сonnection pools
49. Спасибо за внимание!
Михаил Щербаков
intelliegg.com
spbdotnet.org
github.com/yuske
@yu5k3
Independent Consultant
Editor's Notes
Командная строка - в этом вся мощь WinDbg и его также его недостаток.
Я использую его когда надо отлаживать VS. Хотя это и весело, делаю я это не часто
http://eretik.omegahg.com/kd/windbg_natvis.html
Рассказать про мета-команды с префиксом “.” (для просмотра всех help), команды расширения – с префиксом “!”
.loadby sos mscorwks – для .NET 2.0
из расширения SOSEX
Показать декомпилирования в IL код и дизасемблирование в ASM + работу с методанными
Показать декомпилирования в IL код и дизасемблирование в ASM + работу с метаданными
Если метод перегружен bpmd устанавливает точку останова во всех перегруженных методах
Эти команды из SOSEX.
Мы посмотрим на пример установки точки останова внутри .NET FW и анализа получаемой информации.
У команды !EEStack есть замечательный параметр –short, при вызове с ним !EEStack показывает только «интересные» потоки:
* потоки которые взяли блокировку;
* потоки захваченные для выполнения сборки мусора;
* потоки сейчас выполняемые в управляемом коде.
-ee – отображаются только managed stack frames
Добавить имена и MethodTable полей
Сделать пример получения значения поля из предыдущего примера
Сделать пример получения значения поля из предыдущего примера
Это упрощенный пример боевого применения WinDbg
dnlib
На мой взгляд эта фраза отлично описывает, то чем мы занимаемся:
Отладка – это как быть детективом в криминальном фильме, где ты одновременно являешься и убийцей
И WinDbg – это отличный инструмент с поистине безграничными возможностями. Да, у него есть минусы в настройке и удобстве использования, но с помощью него вы можете распутать самые сложные кейсы.
И я сейчас работаем над проектом IntelliDebugger, как раз чтобы привнести многие полезные фичи WinDbg в процесс отладки из Visual Studio. Думаю получится круто!