Отправляет email-рассылки с помощью сервиса Sendsay

Внутренее устройство Windows

  Все выпуски  

Внутренее устройство Windows


Отладка в пользовательском режиме

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

Invasive (инвазивный) Если не указано иное,то,когда вы подключаетесь к выполняемому процессу,Windows-функция DebugActiveProcess устанавливает соединение между отладчиком и отлаживаемым процессом.Это позволяет изучать и/или изменять память процесса,устанавливать точки прерывания (breakpoints) и выполнять другие отладочные действия.В Windows 2000 при завершении отладчика закрывается и отлаживаемый процесс.Однако в Windows ХР отладчик можно отключать,не уничтожая целевой процесс.

Noninvasive (неинвазивный) В этом случае отладчик просто открывает процесс через функцию OpenProcess.Он не подключается к процессу как отладчик.Это позволяет изучать и/или изменять память целевого процесса,но не дает возможности устанавливать точки прерывания.Преимущество данного варианта в том,что в Windows 2000 можно закрыть отладчик,не завершая целевой процесс.
 
 С помощью отладочных средств также можно открывать файлы дампов процессов пользовательского режима.
 Microsoft предлагает отладчики ядра в двух версиях: командной строки (kd.exe) и с графическим пользовательским интерфейсом (Windbg.exe).Оба инструмента предоставляют одинаковый набор команд,так что выбор конкретной утилиты определяется сугубо личными пристрастиями.С помощью этих средств вы можете вести отладку ядра в трех режимах.
 
 Откройте файл дампа,полученный в результате краха системы с Windows.
 Подключитесь к работающей системе и изучите ее состояние (или подставьте точки прерывания,если вы отлаживаете код драйвера устройства).Эта операция требует двух компьютеров - целевого и управляющего.Целевой считается отлаживаемая система,а управляющей - та,в которой выполняется отладчик.Целевая система можетбыть либо локальной (соединенной с управляющей нуль-модемным кабелем или по IEEE 1394),либо удаленной (соединенной по модему).Вы должны загрузить целевую систему со спецификатором /DEBUG,или нажать при загрузке клавишу f8 и выбрать Debug Mode или добавить соответствующую запись в файл boot.ini.
 В случае Windows XP и Windows Server 2003 подключитесь к локальной сист еме и изучите ее состояние.Это называется локальной отладкой ядра.Чтобы инициировать такую отладку ядра,выберите в меню File команду Kernel Debug,перейдите на вкладку Local и щелкните OK.Некоторые команды отладчика ядра в этом режиме не работают (например,просмотр стеков ядра и создание дампа памяти командой .dump невозможны).Однако вы можете пользоваться бесплатной утилитой LiveKd (скачать сдесь http://www.catalog3.ru/soft/index1.html) в тех случаях,когда родные средства локальной отладки не срабатывают.
 Подключившись в режиме отладки ядра,вы можете использовать одну из многих команд расширения отладчика (команды,которые начинаются с <<!>>) для вывода содержимого внутренних структур данных,например потоков,процессов,пакетов запроса на ввод-вывод и информации,связанной с управлением памятью.Команды отладчика ядра и их вывод будут обсуждаться при рассмотрении соответствующей тематики.А пока добавим,что команда dt (display type) может форматировать свыше 400 структур ядра благодаря тому,что файлы символов ядра для Windows 2000 Service Pack 3,Windows XP и Windows Server 2003 содержат информацию о типах,которая и позволяет отладчику форматировать структуры.
 
 ЭКСПЕРИМЕНТ:отображение информации о типах для структур ядра
 Чтобы вывести список ядра,чья информация о типах включена в символы ядра,наберите dt nt!_* в отладчике ядра.Пример части вывода показан ниже:
 
lkd> dt nt!_*
          nt!_LIST_ENTRY
 nt!_LIST_ENTRY
 nt!_IMAGE_NT_HEADERS
 nt!_IMAGE_FILE_HEADER
 nt!_IMAGE_OPTIONAL_HEADER
 nt!_IMAGE_NT_HEADERS
 nt!_LARGE_INTEGER
 
 Команда dt позволяет искать конкретные структуры по шаблонам.Например,если вы ищете имя структуры для объекта прерывания (interrupt object),введите dt nt!_*interrupt*:
 
lkd> dt nt!_*interrupt*
          nt!_KINTERRUPT
 nt!_KINTERRUPT_MODE
 
 После этого с помощью команды dt можно отформатировать эту структуру:
 
lkd> dt nt!_kinterrupt
nt!_KINTERRUPT
      +0x000 Type            :Int2B
 +0x002 Size            :Int2B
 +0x004 InterruptListEntry: _LIST_ENTRY
 +0x00c ServiceRoutine  :Ptr32
 +0x010 ServiceContext  :Ptr32 Void
 +0x014 SpinLock        :Uint4B
 +0x018 TickCount       :Uint4B
 +0x01c ActualLock      :Ptr32 Uint4B
 +0x020 DispatchAddress :Ptr32
 +0x024 Vector          :Uint4B
 +0x028 Irql            :UChar
 +0x029 SynchronizeIrql :UChar
 +0x02a FloatingSave    :UChar
 +0x02b Connected       :UChar
 +0x02c Number          :Char
 +0x02d ShareVector     :UChar
 +0x030 Mode            :_KINTERRUPT_MODE
 +0x034 ServiceCount    :Uint4B
 +0x038 DispatchCount   :Uint4B
 +0x03c DispatchCode    :[106] Uint4B
 
 Заметьте,что по умолчанию dt не показывает подструктуры (структуры внутри структур).Для рекурсивного прохода по подструктурам,используйте ключ -r.Например,указав этот ключ для отображения объекта ядра <<прерывание>>,вы увидите формат структуры _LIST_ENTRY,хранящейся в поле InterruptListEntry:
 
lkd> dt nt!_kinterrupt -r
nt!_KINTERRUPT
     +0x000 Type             :Int2B
+0x002 Size             :Int2B
+0x004 InterruptListEntry:
   +0x000 Flink             :Ptr32
  +0x000 Flink            :Ptr32 _LIST_ENTRY
  +0x004 Blink            :Ptr32 _LIST_ENTRY
+0x004 Blink             :Ptr32
  +0x000 Flink            :Ptr32 _LIST_ENTRY
  +0X004 Blink            :Ptr32 _LIST_ENTRY
+0x00c ServiceRoutine   :Ptr32
 
 В справочном файле Windows Debbuging Tools объясняется,как устанавливать и использовать отладчики ядра.Дополнительные сведения о применении отладчиков ядра,предназначенных в основном разработчикам драйверов устройств,см. в документации Windows DDK.Есть также несколько полезных статей в Knowledge Base по отладчикам ядра.

В избранное