[Previous] [Next]

Отладчики

Отладчик WinDbg

Одним из отладчиков, который может использовать разработчик драйверов, является отладчик WinDbg, поставляющийся в составе пакета DDK. Отладчик WinDbg представляет собой гибрид отладчика уровня ядра и пользовательского режима. При помощи WinDbg можно проводить анализ файлов "crash dump files" (отображение физической памяти в момент сбоя), отлаживать драйверный код путем трассирования (исполнения), анализировать "dump file" приложений (пользовательского режима).

Помимо того, что WinDbg выполняет свои задачи и в режиме ядра, и в пользовательском режиме, он также предоставляет рабочий интерфейс и в графической форме, и в форме командной строки, характерной для старых отладчиков.

Одной из самых значительных возможностей, которой обладает отладчик WinDbg, является его способность поддерживать отладку компонентов уровня ядра в исходных текстах отлаживаемых модулей. При этом отладчику должны быть доступны и исходные тексты, и файлы с отладочными символами (далее они будут называться "файлы идентификаторов").

Тем не менее, отладка в исходных текстах представляет достаточно существенную организационную проблему.

Во-первых, для отладки драйвера требуется два компьютера, на одном из которых работает собственно отладчик, а на втором — отладочный агент, относительно небольшой объем кода, который получает управляющие команды с первого компьютера.

Во-вторых, для проведения отладки потребуется отладочная версия операционной системы, для которой имеются соответствующие файлы отладочных символов.

Сумма этих затруднений может перевесить чашу весов в пользу других отладчиков, в особенности, отладчика SoftIce фирмы CompuWare Corporation (разумеется, если не принимать в рассмотрение цену полной версии пакета Driver Studio).

Директории идентификаторов

Файлы идентификаторов (symbol files) создаются по дополнительно установленным флагам компиляции при компиляции и сборке проекта. В них находятся имена локальных и глобальных переменных, адреса функций и информация об определениях типов данных. Приводится также информация о номерах строк, поэтому машинные инструкции могут быть легко соотнесены с исходным текстом. Программные средства Microsoft могут предоставлять эти файлы в нескольких форматах: более старом (но более типичном) COFF (Common Object File Format) и формате PDB (Program Database), что определяется настроечными флагами компиляции и сборки.

Сама операционная система Windows тоже поставляется с файлами идентификаторов, которые могут быть и на дополнительном диске дистрибутива, и в составе DDK (разумеется, речь не идет об исходных текстах). Для операционной системы Windows 2000 такие файлы, возможно, до сих пор можно загрузить с Интернет сервера Microsoft. Для остальных версий они распространяются Microsoft в рамках подписки MSDN либо в составе набора CD дисков Driver Suite. Поскольку файлы идентификаторов меняются при каждой новой сборке (build), то обновление системы (service pack) требует также и обновления файлов идентификаторов, относящихся к системным модулям.

Доступ к файлам идентификаторов драйвера и системных модулей исключительно важен, поскольку они обеспечивают информацию о стеке вызовов и привязку к исходному тексту (драйвера).

Когда установлены необходимые файлы идентификаторов, отладчику WinDbg необходимо сообщить об их местонахождении. Это выполняется с использованием в пункте Symbol File Path пункта меню File. Идентификаторы операционной системы обычно устанавливаются в директории %SystemDir%\Symbols. Файлы идентификаторов драйвера (расширения .DBD или .PDB) обычно хранятся вместе с бинарным файлом драйвера (.SYS, .WDM).

Директории исходных текстов

Помимо файлов идентификаторов отладчику понадобятся файлы исходных текстов драйвера (.c, .cpp, .h). Путь к ним необходимо указать в пункте Source File Path пункта меню File.

Запуск и окончание отладочной сессии

Основное предназначение отладчика WinDbg — интерактивная отладка. Для этого необходимо наличие двух компьютеров: целевого (на нем будет запущен тестовый код) и хост-компьютер (на котором производится разработка и работает WinDbg). Существенно здесь то, что для управления и мониторинга активности на целевом компьютере используется интерфейс последовательных портов. На рисунке 13.1 показано соединение хост и целевого компьютеров и размещение файлов на них.

Для успешной отладки необходимо, чтобы все нужные файлы оказались на своих местах. Последовательность действий такова.

Рис. 13.1
Интерактивная отладка с использованием WinDbg

  1. Инсталлировать бинарный файл драйвера на целевой машине, причем там не нужно устанавливать файлы идентификаторов или исходного текста.
  2. На хост-компьютере необходимо иметь файлы идентификаторов драйвера и файлы идентификаторов операционной системы, установленной на целевом компьютере. Неплохо было бы, чтобы на двух компьютерах была бы установлена одна и та же версия системы (и одинаковые обновления, Service pack), однако это не является жестким условием.
  3. На хост-компьютере запускается WinDbg. Происходит установка путей к исходному коду и к файлам идентификаторов. Эти файлы должны соответствовать бинарному файлу отлаживаемого драйвера, который находится на целевом компьютере.
  4. Необходимо выбрать отладку в режиме ядра в меню View закладки Options Kernel Debugger в отладчике WinDbg.
  5. Необходимо установить приемлемые значения номера СОМ порта и скорости передачи из упомянутого диалогового окна.
  6. Следует выбрать кнопку GO или ввести команду g в окне командной строки отладчика для того, чтобы перевести WinDbg в режим ожидания соединения с целевым компьютером.
  7. Необходимо выполнить перезагрузку целевого компьютера, разрешив использование клиента отладки. Когда завершится перезагрузка системы на целевом компьютере, соединение будет установлено. В командном окне WinDbg будет выведено соответствующее сообщение.

Хост-компьютер теперь имеет полный контроль над целевым компьютером. Можно устанавливать точки прерывания, даже в том коде, который еще не был загружен в память ядра.

Чтобы разорвать отладочную сессию, необходимо выполнить следующее.

  1. Сделать паузу, нажав Ctrl-C в командном окне WinDbg.
  2. Следует выбрать Edit — Breakpoints в отладчике WinDbg, затем выполнить Clear All. Важно выполнить очистку точек останова до прекращения отладочной сессии.
  3. Следует выбрать Run — Go для того, чтобы разрешить дальнейшую работу на целевом компьютере.
  4. Выйти из WinDbg (Alt-F4).

Целевой компьютер может отреагировать некоторой задержкой на разрыв соединения, возможно из-за того, что процедуры KdPrint и DbgPrint более не имеют получателя своих сообщений и им нужно некоторое время для отработки этой ситуации.

Отладчик SoftIce

Отладку драйвера режима ядра на одном компьютере обеспечивает мощный отладчик SoftIce, разработанный фирмой CompuWare Corporation и входящий в состав пакета DriverStudio. Внешний вид интерфейса отладчика сохранился еще со времен MS DOS, однако, при некоторой тренировке с использованием мнемонических команд, вряд ли это доставит много неудобств, тем более что SoftIce управляется мышкой, включая мышку с колесиком.

Параметры запуска устанавливаются конфигуратором DSConfig, который определяет способ запуска SoftIce (при загрузке, по СОМ, по IP адресу, запуск по требованию на данном компьютере), настройки размера окна, настройки мышки.

При настройке загрузки по требованию следует явно запустить из меню команд Пуск -... - Start SoftIce. Данная команда загружает отладчик, а собственно его активация производится комбинацией Ctrl-D.

В том случае, если нужно выполнить отладку драйвера, после загрузки SoftIce следует загрузить файл драйвера (для отладки в исходных текстах — обязательно отладочную версию) программой loader32 командой Пуск — ... — Symbol Loader. Лишь после этого следует активировать отладчик нажатием Ctrl-D.

При помощи команды h в окне активированного отладчика можно ознакомиться с полным набором и форматом команд. Это же можно узнать и из прилагаемой документации.

При помощи определенных команд несложно отыскать драйвер в памяти, если известно имя драйвера или объекта устройства, после чего можно устанавливать точки прерывания в коде драйвера. Затем следует деактивировать отладчик повторным нажатием Ctrl-D. В момент, когда приложение пользовательского режима вызовет драйвер и, соответственно, достигнет указанной точки прерывания, отладчик активизируется самостоятельно. В окне отладчика будет виден нужный фрагмент драйвера.

В то время, когда активно окно отладчика SoftIce, активность операционной системы замирает: не обновляются показания часов, не работает обмен через clipboard и т.п.

Следует отметить, что при работе с SoftIce не следует использовать сложные мышки (например, четырехкнопочные, с двумя колесиками) и мышки USB. Объясняется это тем, что, являясь настоящим отладчиком режима ядра, SoftIce пытается работать с устройствами ввода напрямую, не всегда понимая новые экзотические устройства.

Более детально ознакомиться с отладчиком SoftIce можно, загрузив trial-версию с Интернет сайта CompuWare Corporation.