WinDbg підручник
Початок роботи з WinDbg
У цьому розділі наведено огляд того, що таке windbg, і чому розробник може захотіти його використовувати.
Слід також згадати будь-які великі теми у windbg та посилання на пов'язані теми. Оскільки Documentation for windbg є новим, вам може знадобитися створити початкові версії цих пов'язаних тем.
Версії
Важливі версії WinDbg для версій WinDbg, що підтримуються. Див. Також докладний список із історичними версіями онлайн.
Важливо, що з версією 6.12 змінилася схема версій версій до новішої версії 6.1. Старші версії мають низьке число (<100) на третьому місці, а нові версії - з великими номерами (>6000).
У багатьох випадках версії WinDbg для нових версій Windows, як і раніше, працюють у більш старих версіях Windows, наприклад, версія 10 WinDbg все ще може використовуватися в Windows 7. Однак деякі команди можуть використовувати виклики API, які недоступні і, таким чином, не працюють . Тому добре мати кілька версій WinDbg.
| Версія |
Опис |
Дата виходу |
| 6.12.0002.633 |
для Windows 7 та .NET Framework 4 |
2010-05-21 |
| 6.1.7600.16385 |
2009-07-24 |
| 6.2.8400.0 |
оновлення для Windows 8 (?) |
2012-06-23 |
| 6.2.9200.16384 |
для Windows 8 та .NET Framework 4.5 |
2012-11-15 |
| 6.3.9600.16384 |
для Windows 8.1 |
2013-10-17 |
| 10.0.10075.9 |
для Windows 10 |
2015-04-29 |
| 10.0.10586.567 |
надається з Windows 10, побудуйте 1511 |
2015-10-30 |
| 10.0.14321.1024 |
надається з Windows 10, побудуйте 1607 |
2016-07-29 |
Встановлення або налаштування
Microsoft описує три способи встановлення WinDbg:
- як частина WDK (комплект драйверів Windows)
- як частина SDK (Software Development Kit)
- з установником SDK та зняттям виділення з іншого, крім «Налагодження для Windows»,
Щоб отримати програму встановлення, відвідайте сторінку завантаження WDK, WinDbg та пов'язаних з нею інструментів і прокрутіть вниз до розділу «Отримати інструменти налагодження».
Відомим і зручним, але неофіційним джерелом є Codemachine, де ви також можете завантажити більш старі версії засобів налагодження.
Сама установка прямолінійна. Пройдіть через установник, доки він не закінчиться.
Debuggers
WinDbg часто використовується як абревіатура "Кошти налагодження для Windows". Він містить різні відладчики:
| дебаггер |
Опис |
| WinDbg |
відладчик із графічним інтерфейсом користувача |
| CDB |
c onsole d e b ugger, відладчик режиму користувача, який запускається в поточній відкритій консолі |
| НЦД |
n ew t erninal s ymbolic d ebugger, відладчик режиму користувача, який відкриває новий термінал (консоль), як випливає з назви |
| KD |
k ernel d ebugger, який працює у відкритій консолі |
| NTKD |
n ew t erninal k ernel d ebugger відкриває новий термінал |
Команди ідентичні, за винятком того, що можуть бути команди, пов'язані з GUI, які не працюють у консольних версіях.
Початок роботи з WinDbg (режим користувача)
WinDbg — це відладчик у режимі ядра та режимі користувача, включений у засоби налагодження для Windows. Наступні практичні вправи допоможуть вам приступити до використання WinDbg як відладчика в режимі користувача.
Відомості про те, як отримати засоби налагодження для Windows, див. у розділі "Завантажити та інсталювати налагоджувач Windows WinDbg".
Після встановлення засобів налагодження знайдіть каталоги установки для 64-розрядних (x64) та 32-розрядних (x86) версій засобів. Наприклад:
- C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
- C:\Program Files (x86)\Windows Kits\10\Debuggers\x86
Відкрийте Блокнот та підключіть WinDbg
- Перейдіть до каталогу установки та відкрийте WinDbg.exe.
- У меню "Файл" виберіть "Запустити виконуваний файл". У діалоговому вікні запуску виконуваного файлу перейдіть в папку, що містить notepad.exe. (Файл notepad.exe зазвичай знаходиться в C:\Windows\System32.) поле "Ім'я файлу" введіть notepad.exe. Виберіть Відкрити.
- У командному рядку в нижній частині вікна WinDbg введіть наступну команду: .sympath srv* Вихідні дані схожі на цей приклад:
Symbol search path is: srv* Expanded Symbol search path is: cache*;SRV
Примітка.Якщо вихідні дані не відображаються, введіть .reload /f спробу примусового завантаження символів. Використовуйте шум !sym для відображення додаткових відомостей про завантаження символів.
Щоб переглянути символи в модулі notepad.exe, які містяться в main , використовуйте команду перевірки символів для перерахування модулів, що відповідають масці: x notepad!wWin* Вихідні дані схожі на цей приклад:
00007ff6`6e76b0a0 notepad!wWinMain (wWinMain) 00007ff6`6e783db0 notepad!wWinMainCRTStartup (wWinMainCRTStartup)
0 e Disable Clear 00007ff6`6e76b0a0 0001 (0001) 0:**** notepad!wWinMain
Breakpoint 0 hit notepad!wWinMain: 00007ff6`6e76b0a0 488bc4 mov rax
Щоб переглянути список модулів коду, завантажених на даний момент у процесі Блокнот, введіть наступну команду: Lm Вихідні дані схожі на цей приклад:
0:000> lm start end module name 00007ff6`6e760000 00007ff6`6e798000 notepad (pdb symbols) C:\ProgramData\Dbg\sym\notepad.pdb\BC04D9A431EDE299D4625AD6201C8A4A1\notepad.pdb 00007ff8`066a0000 00007ff8`067ab000 gdi32full 00007ff8`067b0000 00007ff8`068b0000 ucrtbase (deferred) 00007ff8`06a10000 00007ff8`06aad000 msvcp_win (deferred) 00007ff8 00007ff8`06ad2000 win32u (deferred) 00007ff8`06b40000 00007ff8`06e08000 KERNELBASE (deferred) 00007ff8`07220000 00007ff300 00007ff8`07420000 00007ff8`07775000 combase (deferred) 00007ff8`07820000 00007ff8`079c0000 USER32 (deferred) 00007ff8`079 00007ff8`079f0000 IMM32 (deferred) 00007ff8`07c00000 00007ff8`07c2a000 GDI32 (deferred) 00007ff8`08480000 00007ff8`08 00007ff8`085b0000 00007ff8`0864e000 msvcrt (deferred) 00007ff8`08c40000 00007ff8`08cee000 shcore (deferred) 00007ff8`08000 ntdll (pdb symbols) C:\ProgramData\Dbg\sym\ntdll.pdb\53F12BFE149A2F50205C8D5D66290B481\ntdll.pdb 00007fff`f8580000 00007fff`f88a
Щоб переглянути трасування стека, введіть таку команду: k Вихідні дані схожі на цей приклад:
0:000> k 00 000000c8`2647f708 00007ff6`6e783d36 notepad!wWinMain 01 000000c8`2647f710 00007ff8`07237034 notepad! 02 000000c8`2647f750 00007ff8`08e02651 KERNEL32!BaseThreadInitThunk+0x14 03 000000c8`2647f780 00000000`00000000
0:011> ~ 0 Id: 5500.34d8 Suspend: 1 Teb: 000000c8`262c4000 Unfrozen 1 Id: 5500.3960 Suspend: 1 Teb: 000000c8`262c6000 Un5 1 Teb: 000000c8`262c8000 Unfrozen 3 Id: 5500.4c90 Suspend: 1 Teb: 000000c8`262ca000 Unfrozen 4 Id: 5500.4ac4 Suspend: 1 Teb: 000 5500.293c Suspend: 1 Teb: 000000c8`262ce000 Unfrozen 6 Id: 5500.53a0 Suspend: 1 Teb: 000000c8`262d0000 Unfrozen 7 Id: 5500.3ca4 000000c8`262d4000 Unfrozen 8 Id: 5500.808 Suspend: 1 Teb: 000000c8`262da000 Unfrozen 10 Id: 5500.3940 Suspend: 1 Teb: 00000000 11 Id: 5500.28b0 Suspend: 1 Teb: 000000c8`262de000 Unfrozen 12 Id: 5500.12bc Suspend: 1 Teb: 000000c8`262e0000 Unfrozen 13 Id: 13 Id: 000000c8`262e2000 Unfrozen
0:011 > ~0s 0:011> ~0s win32u!NtUserGetProp+0x14: 00007ff8`06ab1204 c3 ret 0:000> k # Child-SP RetAddr Call Site 00 000000c8`26800 win32u!NtUserGetProp+0x14 01 000000c8`2647bd10 00007fff`f86099be USER32!GetPropW+0xd1 02 000000c8`2647bd40 00007 COMCTL32!DefSubclassProc+0x4e 03 000000c8`2647bd90 00007fff`f8609aba SHELL32! COMCTL32! CallNextSubclassProc+0x9a 05 000000c8 `2647be60 00007ff8`0782e858 COMCTL32! USER32!UserCallWinProcCheckWow+0x2f8 07 000000c8`2647c090 00007ff8`0782d68a USER32!SendMessageWorker+0x70b 08 000000c8`2647 USER32! SendMessageW+0xda
Відкрийте власну програму та підключіть WinDbg
Наприклад, припустимо, що ви написали і створили цю невелику консольну програму:
. void MyFunction(long p1, long p2, long p3) < long x = p1 + p2 + p3; long y = 0; y = x/p2; >void main ()
У цій вправі передбачається, що вбудований додаток (MyApp.exe) та файл символів (MyApp.pdb) знаходяться в C:\MyApp\x64\Debug. Також припустимо, що вихідний код програми знаходиться в C: MyApp і MyApp і що цільовий комп'ютер, скомпільований MyApp.exe.
- Відкрийте WinDbg.
- У меню "Файл" виберіть "Запустити виконуваний файл". У діалоговому вікні запуску виконуваного файлу перейдіть до розділу C:\MyApp\x64\Debug. поле "Ім'я файлу" введіть MyApp.exe. Виберіть Відкрити.
- Введіть такі команди: .symfix.sympath+ C:\MyApp\x64\Debug Команди повідомляють WinDbg, де знайти символи та вихідний код програми. У цьому випадку розташування вихідного коду не потрібно задавати за допомогою Srcpath, оскільки символи мають повні шляхи до вихідних файлів.
- Введіть наступні команди: .Перезавантажитиbu MyApp!maing Додаток розбивається на налагоджувач, коли йдеться про його main функції. WinDbg відображає вихідний код та вікно командного рядка.
- У меню налагодження виберіть "Крок у" (або "F11"). Продовжуйте покрокове виконання до тих пір, поки не увійдете MyFunction в . При переході в рядок y = x / p2 програма завершує роботу і переривається у налагоджувач. Вихідні дані схожі на цей приклад:
(1450.1424): Integer divide-by-zero - код c0000094 (перша зміна) Перші зміни exceptions є повідомлені перед будь-яким виведенням handling. Цей висновок може бути expected і handled. MyApp !
FAULTING_IP: MyApp! ExceptionAddress: 00007ff63be11064 (MyApp!MyFunction+0x0000000000000044) ExceptionCode: c0000094 (Integer divide-by-zero) ExceptionFlags: 00000000 Number0 STACK_TEXT: 00000063`2036f7e0 00007ff6`3be110b8 : . : MyApp!MyFunction+0x44 00000063`2036f800 00007ff6`3be1141d : MyApp!main+0x38 00000063`2036f840 00007ff6`3be1154e : . : MyApp!__tmainCRTStartup+0x19d 00000063`2036f8b0 00007ffc`b1cf16ad : . : MyApp!mainCRTStartup+0xe 00000063`2036f8e0 00007ffc`b1fc4629 : . : KERNEL32!BaseThreadInitThunk+0xd 00000063`2036f910 00000000`00000000 : . : ntdll!RtlUserThreadStart+0x1d STACK_COMMAND: dt ntdll!LdrpLastDllInitializer BaseDllName ;dt ntdll!LdrpFailureData . 00007ff6`3be11064 f77c2428 idiv eax,dword ptr [rsp+28h] FAULTING_SOURCE_LINE: c:myapp\myapp\myapp.cpp FAULTING_SOURCE_FILE: c:\myapp\myapp\myapp.cpp FAULTING_SOURCE_CODE: 3: void MyFunction(long p1, long p2, long p3) 4: < 5: long x = p1 + p2 + p3; 6: long y = 0; >7: y = x / p2; 8: > 9: 10: void main () 11: < 12: long a = 2; .
Зведення команд
- Contents команда в меню Help
- .sympath (задати шлях до символів)
- .reload (модуль перезавантаження)
- x (перевірка символів)
- g (Go)
- Break команда у Debug меню
- lm (список завантажених модулів)
- k (Відображення стека backtrace)
- bu (Встановлення точки зупинки)
- BL (список точок зупинки)
- ~ (стан потоку)
- ~s (установка поточного потоку)
- .sympath+ (Задати шлях до символів) додається до існуючого шляху символу
- .srcpath (задати шлях до джерела)
- Step Into команда в меню Debug (F11)
- !analyze -v
- qd (вихід та відключення)