WinDbg
сотоварищи
Михаил Щербаков
MSK .NET Meetup #1
Independent Consultant
Обо мне
 Консультант, Upwork’er,
 Разработчик проекта IntelliDebugger http://intelliegg.com
 Координатор сообществ .NET программистов Москвы и
Санкт-Петербурга http://mskdotnet.org/ http://spbdotnet.org
 В прошлом менеджер по продуктам и тимлид в Cezurity,
Acronis, Luxoft, Boeing
Зачем WinDbg мне?
Какой отладчик использовать, если
нужно отлаживать расширение
отладчика Visual Studio,
отлаживающего другой процесс?
Зачем он вам?
- Найти deadlock?
- Легко* с WinDbg
Зачем он вам?
Плюсы WinDbg
 Легкий отладчик, быстро запускается
 Предоставляет больше данных для анализа
 Гибкая и автоматизируемая скриптами отладка кода
 Вменяемый анализ дампов
 Вменяемая отладка смешанного (mixed) кода
Минусы WinDbg
 Командная строка - долго не используешь, быстро забываешь
 Ужасный GUI
 Имеет странности
Настройка WinDbg
Командная строка
http://www.wintellect.com/devcenter/jrobbins/a-cool-windbg-sos-hidden-feature
 Удобно использовать
.cmdtree
Графический интерфейс
https://github.com/yuske/DotNextMsk2015
Отладочные символы
0:000> .sympath
Symbol search path is: <empty>
Отладочные символы
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
Отладочные символы
> setx _NT_SYMBOL_PATH cache*C:symbols;SRV*C:symbo
ls*http://msdl.microsoft.com/download/symbols;host
buldslast /m
> set _NT_ALT_SYMBOL_PATH <path>
https://msdn.microsoft.com/en-
us/library/windows/hardware/ff558829(v=vs.85).aspx
Отображение переменных
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
Отображение переменных
> cd "C:Program Files (x86)Windows Kits10
Debuggersx86"
> mklink /d Visualizers "C:Program Files (x86)
Microsoft Visual Studio 14.0Common7Packages
DebuggerVisualizers“
Расширения для отладки .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
Сценарии отладки
Загрузка расширений
0:000> .loadby sos.dll clr
0:000> .load sosex
0:000> .load netext
0:000> .load psscor4
0:000> .load spt
Исследование метаданных
 Type Handle
 Sync Block Table
 Method Table
 Method Descriptors
 Modules
 Metadata Tokens
 EEClass
Исследование метаданных
!DumpDomain [<domain address>]
!DumpModule [-mt] <Module address>
!DumpAssembly <assembly address>
!DumpClass <EEClass address>
!DumpMT [-MD] <MethodTable address>
!IP2MD <code address>
!DumpMD <MethodDesc address>
!Name2EE <type name>
Исследование метаданных
0:000> !mx Demo!*Thread*
AppDomain 724c6770 (Shared Domain)
----------------------------------------------------
AppDomain 0085dc28 (Demo.exe)
----------------------------------------------------
module: Demo
class: Demo.Program
StartThreadA()
StartThreadB()
Управление точками останова
0:004> !name2ee Bar.exe Bar.App.Foo
Module: 00112d8c (Bar.exe)
Token: 0x06000002
MethodDesc: 00113178
Name: Bar.App.Foo(Int32, Int32)
JITTED Code Address: 003e0178
0:004> bp 003e0178
Управление точками останова
0:004> !name2ee Bar.exe Bar.App.Foo
Module: 00112d8c (Bar.exe)
Token: 0x06000002
MethodDesc: 00113178
Name: Bar.App.Foo(Int32, Int32)
Not JITTED yet. Use !bpmd -md 00113178 to break on run.
0:004> !bpmd –md 00113178
MethodDesc = 00113178
Adding pending breakpoints...
Управление точками останова
0:004> !bpmd Bar.exe Bar.Comparer`1.GreaterThan
Found 1 methods...
MethodDesc = 001a3188
Adding pending breakpoints...
Управление точками останова
!mbm <Type/Method Filter> [ILOffset] [Options]
!mbp <SourceFile> <nLineNum> [ColNum] [Options]
Исследование .NET Framework
Операции с потоками
Операции с потоками
0:004> !threads
ThreadCount: 3
UnstartedThread: 0
BackgroundThread: 1
...
ID OSID ThreadOBJ State ... Apt Exception
0 1 316c 0109b6e0 202a020 MTA
5 2 1f88 010a8e98 2b220 MTA (Finalizer)
6 3 1968 010c8960 202b020 MTA
Операции с потоками
0:004> !ClrStack
OS Thread Id: 0x316c (0)
Child SP IP Call Site
0018ec34 77b96e3c [HelperMethodFrame: 0018ec34]
System.Threading.Thread.SleepInternal(Int32)
0018ecb8 70bebfca System.Threading.Thread.Sleep(Int32)
0018ecc0 00f30740 Demo.Program.SampleB()
[C:DemoProgram.cs @ 66]
0018ed14 00f304ed Demo.Program.Main(System.String[])
[C:DemoProgram.cs @ 17]
Операции с потоками
!DumpStack [-ee]
!mk [FrameCount] [-l] [-p] [-a]
!EEStack –short [-ee]
Поиск deadlock’ов
Исследование объектов в памяти
0:000> dd 0x01e06bec
01e06bec 001c30b0 00000000 00000000 00000000
01e06bfc 80000000 790fd8c4 00000014 00000013
01e06c0c 003a0078 0030007b 002c007d 00790020
01e06c1c 007b003a 007d0031 0020002c 003a007a
01e06c2c 0032007b 0000007d 00000000 00000000
01e06c3c 00000000 00000000 00000000 00000000
01e06c4c 00000000 00000000 00000000 00000000
01e06c5c 00000000 00000000 00000000 00000000
Исследование объектов в памяти
0:000> !DumpObj 0x01c56bec
Name: Bar.App
MethodTable: 002130b0
EEClass: 00211240
Size: 20(0x14) bytes (C:samplesBar.exe)
...
Исследование объектов в памяти
!DumpVC <MethodTable address> <Address>
!DumpArray [-start <startIndex>] [-length <length>]
[-details] [-nofields] <Array object address>
Исследование объектов в памяти
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
Исследование объектов в памяти
!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
Исследование объектов в памяти
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
Исследование объектов в памяти
!GCRoot [-nostacks] <Object address>
!gcgen <hexObjectAddr>
!dumpgen <intGenNum> [-free] [-stat] [-type
<TYPE_NAME>] [-nostrings]
Анализ memory leak’ов
Отладка web-приложений
!whttp – список HttpContext обектов
!wservice – список WCF service обектов
!wsocket – информация о сокетах
!DumpASPNetRequests – список потоков с HttpContext
!DumpSqlConnectionPools – информация о всех Sql
сonnection pools
Дополнительные инструменты
dnSpy
https://github.com/0xd4d/dnSpy
CLR MD (Microsoft.Diagnostics.Runtime.dll)
http://msk2015.dotnext.ru/talks/goldshtein
PyKd
http://2015.phdays.ru/program/40602
Что дальше?
Книги
http://amzn.to/21TWSWd http://amzn.to/1NK2bl0 http://amzn.to/1QzZIdR
Блоги
 Sasha Goldshtein
http://blogs.microsoft.co.il/sasha/
 John Robbins
http://www.wintellect.com/devcenter/jrobbins
 EreTIk's Box
http://eretik.omegahg.com/WinDbg.html
Цитата
Спасибо за внимание!
Михаил Щербаков
intelliegg.com
spbdotnet.org
github.com/yuske
@yu5k3
Independent Consultant

More Related Content

PPTX
WinDbg со товарищи
PPTX
WinDbg в руках .NET разработчика
PDF
20130429 dynamic c_c++_program_analysis-alexey_samsonov
ODP
Boost.Algorithm: что, зачем и почему
PPTX
Web осень 2013 лекция 5
PDF
Модель памяти C++ - Андрей Янковский, Яндекс
PDF
Парсим CSS
PDF
JavaDay'14
WinDbg со товарищи
WinDbg в руках .NET разработчика
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Boost.Algorithm: что, зачем и почему
Web осень 2013 лекция 5
Модель памяти C++ - Андрей Янковский, Яндекс
Парсим CSS
JavaDay'14

What's hot (20)

PDF
Web осень 2013 лекция 2
PDF
Web осень 2013 лекция 3
PPTX
Web осень 2013 лекция 9
PPTX
JSQuest d:)
PDF
Konstantin Krivlenia - "Continuous integration for frontend"
PDF
Web осень 2013 лекция 1
PPTX
Взломать сайт на ASP.NET
PDF
Подводные камни System.Security.Cryptography
PPTX
Convert this: peculiarities of cross-platform mobile game development at Vizor
PDF
Многопоточность в браузере. Модель акторов — Константин Крамлих
PPTX
200 open source проектов спустя: опыт статического анализа исходного кода
PPTX
Подводные камни прикладной криптографии, I
PDF
Почему Rust стоит вашего внимания
PPTX
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
PDF
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
PPTX
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
PDF
Алексей Захаров "Архитектура Яндекс.Фоток"
ODP
Valgrind
PPTX
Web осень 2013 лекция 8
PDF
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Web осень 2013 лекция 2
Web осень 2013 лекция 3
Web осень 2013 лекция 9
JSQuest d:)
Konstantin Krivlenia - "Continuous integration for frontend"
Web осень 2013 лекция 1
Взломать сайт на ASP.NET
Подводные камни System.Security.Cryptography
Convert this: peculiarities of cross-platform mobile game development at Vizor
Многопоточность в браузере. Модель акторов — Константин Крамлих
200 open source проектов спустя: опыт статического анализа исходного кода
Подводные камни прикладной криптографии, I
Почему Rust стоит вашего внимания
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Алексей Захаров "Архитектура Яндекс.Фоток"
Valgrind
Web осень 2013 лекция 8
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Ad

Viewers also liked (15)

PPTX
Автоматизация отладки в windbg
PPTX
Presentación1
PPTX
17. luh maha pitriyani (1211031224)
PDF
5 Seconds Of Summer - Ask / Reply
PDF
611.зоогигиенатерминологический словарь справочник
PDF
slide share
DOCX
Group Name Questionnaire
PDF
HB_Brochure Pension Sector Group_V2
PPTX
Evaluation 4
DOCX
Derecho constitucional.
PPTX
Introduction to Azure DocumentDB
PPTX
poster spring senior year
PPTX
Historyofanimalcellculturecellfinal 120928123709-phpapp01
PPTX
Information System Crimes and issues
PPTX
Questionnaire Results
Автоматизация отладки в windbg
Presentación1
17. luh maha pitriyani (1211031224)
5 Seconds Of Summer - Ask / Reply
611.зоогигиенатерминологический словарь справочник
slide share
Group Name Questionnaire
HB_Brochure Pension Sector Group_V2
Evaluation 4
Derecho constitucional.
Introduction to Azure DocumentDB
poster spring senior year
Historyofanimalcellculturecellfinal 120928123709-phpapp01
Information System Crimes and issues
Questionnaire Results
Ad

More from Mikhail Shcherbakov (20)

PPTX
Delegates and events in C#
PPTX
Mythbusters - Web Application Security
PPTX
Apache Ignite.NET в действии
PPTX
Архитектура Apache Ignite .NET
PPTX
Знакомство с In-Memory Data Grid
PDF
сценарии использования статического анализатора
PPTX
WCF. Легко или проблемно
PDF
Поиск ошибок в программах на языке C#
PPTX
Когда в C# не хватает C++ . Часть 3.
PDF
Project Rider
PPTX
Structured logging
PPTX
RESTful API: Best practices, versioning, design documentation
PPTX
Простой и кросс-платформенный WEB-сервер на .NET
PPTX
Использование Visual Studio Tools for Apache Cordova в реальных проектах
PPTX
Sandboxing in .NET CLR
PPTX
Когда в C# не хватает C++ . Часть 2.
PDF
Распространённые ошибки оценки производительности .NET-приложений
PPTX
Когда в C# не хватает C++
PDF
Как это работает: DLR
PPTX
Visual Studio 2015 Diagnostic and Debugging Tools
Delegates and events in C#
Mythbusters - Web Application Security
Apache Ignite.NET в действии
Архитектура Apache Ignite .NET
Знакомство с In-Memory Data Grid
сценарии использования статического анализатора
WCF. Легко или проблемно
Поиск ошибок в программах на языке C#
Когда в C# не хватает C++ . Часть 3.
Project Rider
Structured logging
RESTful API: Best practices, versioning, design documentation
Простой и кросс-платформенный WEB-сервер на .NET
Использование Visual Studio Tools for Apache Cordova в реальных проектах
Sandboxing in .NET CLR
Когда в C# не хватает C++ . Часть 2.
Распространённые ошибки оценки производительности .NET-приложений
Когда в C# не хватает C++
Как это работает: DLR
Visual Studio 2015 Diagnostic and Debugging Tools

Михаил Щербаков "WinDbg сотоварищи"

Editor's Notes

  • #8: Командная строка - в этом вся мощь WinDbg и его также его недостаток. Я использую его когда надо отлаживать VS. Хотя это и весело, делаю я это не часто
  • #16: http://eretik.omegahg.com/kd/windbg_natvis.html
  • #19: Рассказать про мета-команды с префиксом “.” (для просмотра всех help), команды расширения – с префиксом “!” .loadby sos mscorwks – для .NET 2.0
  • #22: из расширения SOSEX
  • #23: Показать декомпилирования в IL код и дизасемблирование в ASM + работу с методанными
  • #24: Показать декомпилирования в IL код и дизасемблирование в ASM + работу с метаданными
  • #30: Если метод перегружен bpmd устанавливает точку останова во всех перегруженных методах
  • #31: Эти команды из SOSEX.
  • #32: Мы посмотрим на пример установки точки останова внутри .NET FW и анализа получаемой информации.
  • #36: У команды !EEStack есть замечательный параметр –short, при вызове с ним !EEStack показывает только «интересные» потоки: * потоки которые взяли блокировку; * потоки захваченные для выполнения сборки мусора; * потоки сейчас выполняемые в управляемом коде. -ee – отображаются только managed stack frames
  • #39: Добавить имена и MethodTable полей
  • #40: Сделать пример получения значения поля из предыдущего примера
  • #42: Сделать пример получения значения поля из предыдущего примера
  • #46: Это упрощенный пример боевого применения WinDbg
  • #49: dnlib
  • #55: На мой взгляд эта фраза отлично описывает, то чем мы занимаемся: Отладка – это как быть детективом в криминальном фильме, где ты одновременно являешься и убийцей
  • #56: И WinDbg – это отличный инструмент с поистине безграничными возможностями. Да, у него есть минусы в настройке и удобстве использования, но с помощью него вы можете распутать самые сложные кейсы. И я сейчас работаем над проектом IntelliDebugger, как раз чтобы привнести многие полезные фичи WinDbg в процесс отладки из Visual Studio. Думаю получится круто!