Налагодження, debug, ядра ос windows

Налагодження, debug, ядра ОС Windows

Налагодження, debug, ядра ос windows

Отже, припустимо, нам захотілося заглянути всередину ядра Windows, подивитися, як воно працює. Ну або допустимо ми написали драйвер нашого пристрою, а він не працює або працює неправильно. Потрібно подивитися отладчиком ядра, що відбувається.

Перш за все потрібно підготувати «середу» для налагодження.
Знадобиться 2 комп'ютери з ОС Windows: перший комп'ютер - це той який буде схильний до налагодження, другий комп'ютер - це той, за допомогою якого буде вестися налагодження. У термінології Microsoft перший комп'ютер називається Target. а другий - це Host.

Ці два комп'ютера потрібно з'єднати між собою для передачі налагоджувальної інформації. Є кілька способів:

Ось моє робоче місце для налагодження:

Налагодження, debug, ядра ос windows

Зліва - Target. Інспектовані комп'ютер.
Праворуч - Host. ноутбук відладчика.

В ноутбук підключений кабель USB і програматор MBFTDI. В цьому випадку ми його будемо використовувати просто як перехідник USB2COM. Тобто для ноутбука це як послідовний порт. Правда є нюанс - вихідні рівні програматора MBFTDI не відповідають стандартним в послідовному порту. Тому я ще підключив перетворювач рівнів, на мікросхемі MAX232 (знайшов його серед старих залізяк, у нас для них цілий ящик в офісі).

Тепер потрібно налаштувати Target. У мене тут Windows 7 64х бітова.
Запускаємо командний рядок CMD від імені адміністратора і в ньому виконуємо команди:

> Bcdedit / debug on
> Bcdedit / dbgsettings serial debugport: n baudrate: rate

У мене debugport: COM1 і baudrate: 115200
Це в загальному і є вся настройка інспектується комп'ютера.
Тепер на ньому потрібно просто виконати перезавантаження.

У мене на ноутбуці так само Windows 7 x64. Я встановив WDK і там в складі є потрібний мені відладчик.

Запускаю WindDbg. Вибираємо пункт меню File -> Kernel Debug і з'являється віконце:

Налагодження, debug, ядра ос windows

Обираю швидкість передачі 115200 і ім'я послідовного порту. В принципі все готово.

На ноутбуці Host в програмі WinDbg є командна консоль, достапная через меню View -> Command. З'являється командний рядок відладчика.

Будь-яке високе технологія для спостерігача з боку мало відрізнити від магії ..

На хості в програмі WinDbg натискаю Ctrl + Break і комп'ютер Target зупиняється! Тобто повністю стоять всі процеси і потоки Windows. Можна попити чайку.

В консолі відладчика можна виконувати різні команди. Команд багато, у них багато параметрів, звичайно я не зможу їх все описати. Зрештою для цього є цілком нормальна інструкція-help самої програми WinDbg.

Найпростіші команди:

> r - показати вміст регістра процесора.

> T - виконати одну інструкцію процесора.

> P - виконати інструкцію процесора або цілу процедуру, якщо інструкція call.

Більш того, в отладчике звичайно можна встановити точки зупину різного типу.

Найпростіший приклад:

Ще можна встановити точку зупину по запису або читання заданої комірки пам'яті або порту вводу виводу.

Скасування всіх точок зупину - команда «bc *»

Тут потрібно ще сказати про символічну інформацію.
Звичайно, розглядати голий асемблерний код задоволення не дуже приємне. Потрібно підключити ще зневадження.

Наприклад, ми написали драйвер для ОС Windows. Скомпілювали його debug версію. Разом з файлом драйвера mydrv.sys компілятор генерує ще файл з відповідною символьної інформацією mydrv.pdb.

Зайдемо в меню відладчика File -> Symbol File Path. і в діалоговому вікні додамо шлях до нашого файлу PDB.

> Bp mydrv! DriverEntry - зупинити ядро, коли відбудеться виклик функції DriverEntry нашого драйвера mydrv.

Крім цього, дуже корисно підключити до отладчику ще і символьну інформацію самого ядра Windows. Звичайно, версій Віндовс багато, є різні збірки і де знайти символьну інформацію саме відповідну вашій Target ОС Windows?

Найпростіше, в командному рядку налагоджувача виконати команду

При цьому, потрібні файли налагодження (саме потрібної версії) будуть викачані через інтернет до вас на диск в папку c: \ localsymbols прямо з сервера Microsoft.

Тепер, можна вже більш осмислено дебажіть і саме ядро.

Хочете подивитися, як виглядає, наприклад, функція USBPORTSVC_CompleteIsoTransfer драйвера usbport.sys. Немає проблем:

Налагодження, debug, ядра ос windows

Можна поставити точку зупину і далі по кроках виконати всі інструкції. Символьна інформація допомагає зрозуміти якщо не деталі, то хоча б загальний зміст виконуваного коду чужого драйвера.

Наприклад, дуже багато системних структури даних в ядрі Windows забезпечуються «сигнатурою» - спеціальним рядком, зазвичай з 4 символів. Таким чином, функції ядра мають можливість легко перевірити передані їм покажчики на структури є вірними чи ні. Ось в коді на Картік вище є виклик функції USBPORT_AssertSig. Уже за назвою функції стає приблизно зрозуміло, що вона робить - перевіряє покажчик, чи дійсно він вказує на структуру з потрібною сигнатурою.

Ось ще що. При викликах функцій ядра Windows зазвичай перші чотири параметри функцій передаються в регістрах RCX. RDX. R8 і R9. Схоже інші параметри, якщо їх більше чотирьох, передаються функцій в стеці.

Взагалі відладчик WinDbg дає широкі можливості для налагодження своїх драйверів, а так само можливість для вивчення взагалі ядра ОС Windows.