Принцип работы отладчика ядра операционной системы

  • Вид работы:
    Реферат
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    154,94 Кб
  • Опубликовано:
    2016-11-25
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Принцип работы отладчика ядра операционной системы

Оглавление

 

Введение

1. Типы Windows-отладчиков

2. Отладчики режима пользователя

3. Отладчики режима ядра

3.1 Отладчик WDEB386

3.2 Отладчик I386KD

3.3 Отладчик Win DBG

3.4 Отладчик SoftICE

4. Общий вопрос отладки

5. Автоматический запуск приложений в отладчике

5.1 Быстрые клавиши прерываний

Заключение

Литература

Введение

Изучение механизма работы программных инструментов - наиболее трудная часть отладочного процесса. Только понимая возможности и ограничения инструментов, можно получать от них большую отдачу и тратить меньше времени на отладку. Как правило, отладчики чрезвычайно полезны, но могут привести к довольно тонким проблемам, заводящим программиста в тупик. В этой главе показано, что такое отладчик и как различные отладчики работают в операционных системах Win32 (32-разрядных операционных системах Windows фирмы Microsoft).

При этом сосредоточимся на тех специальных свойствах отладчиков вообще, которые включены, когда под управлением последних выполняется какой-то программный процесс. Кроме того, здесь поясняются возможности усиления некоторых свойств 32-разрядных операционных систем Windows, позволяющие облегчить процесс отладки. Будут представлены два авторских отладчика, исходный код которых можно найти на сопровождающем компакт-диске. Первый (MinDBG) имеет достаточные возможности для того, чтобы его называли отладчиком. Второй (WDBG) - пример отладчика Microsoft Windows, который делает почти все, что и реальный системный отладчик, включая манипулирование таблицами символов, обработку точек прерывания, генерацию кода дизассемблера и координирование с графическим интерфейсом пользователя (GUI). При обсуждении WDBG мы покажем, как работают точки прерывания, и обсудим, что представляют собой различные файлы символов (symbol files).

Прежде чем переходить к основному материалу этой главы, определим два стандартных термина, которые будут часто использоваться в этой книге: основной (или базовый) отладчик (debugger) и подчиненный отладчик (debuggee). Проще говоря, основной отладчик - это процесс, который в отладочном отношении может контролировать другой процесс, а подчиненный отладчик - это процесс, запускаемый под основным отладчиком. В некоторых операционных системах основной отладчик называют родительским процессом, а подчиненный - дочерним.

Отла́дчик (деба́ггер, англ.  debugger от bug) - компьютерная программа, предназначенная для поиска ошибок в других программах, ядрах операционных систем, SQL-запросах и других видах кода. Отладчик позволяет выполнять трассировку, отслеживать, устанавливать или изменять значения переменных в процессе выполнения кода, устанавливать и удалять контрольные точки или условия остановки и т.д.

Большинству разработчиков больше знакомы отладчики пользовательского режима. Не удивительно, что отладчики этого режима предназначены для отладки приложений пользовательского режима (user-mode applications). Главный пример отладчика режима пользователя - отладчик Microsoft Visual C++. Отладчики режима ядра, как следует из их названия, - это такие отладчики, которые позволяют отлаживать ядро операционной системы. Они используются главным образом теми, кто пишет (и отлаживает, конечно) драйверы устройств.

2. Отладчики режима пользователя


Отладчики режима пользователя предназначены для отладки любого приложения, выполняющегося в режиме пользователя, включая любые GUI-программы, а также такие не совсем обычные приложения, как службы (services) Windows 2000. В общем случае, отладчики этого типа поддерживают графический интерфейс пользователя (GUI1). Главный признак таких отладчиков - они используют отладочный интерфейс прикладного программирования (отладочный API) Win32. Поскольку операционная система помечает подчиненный отладчик как "выполняющийся в специальном режиме", то, чтобы выяснить, выполняется ли ваш процесс под отладчиком, можно использовать API-функцию IsDebuggerPresent.

При поставке отладочного API Win32 подразумевается следующее соглашение: раз процесс выполняется под отладочным API (и делает его, таким образом, подчиненным процессом), основной отладчик не может отделиться от данного процесса. Эти симбиозные отношения означают, что если основной отладчик завершает работу, то завершается также и подчиненный отладчик. Основной отладчик ограничивается отладкой только подчиненного отладчика и любых порожденных им процессов (если основной отладчик поддерживает процессы-потомки).

GUI - Graphical User Interface. - Пер.

Для интерпретируемых языков и исполнительных (run-time) систем, которые используют подход виртуальной машины, полную отладочную среду обеспечивают сами виртуальные машины, и они не используют отладочный API Win32. Вот некоторые примеры таких типов сред: виртуальные Java-машины (JVM) фирм Microsoft или Sun, среда сценариев для Web-приложений фирмы Microsoft, и интерпретатор р-кода в системе Microsoft Visual Basic.

отладчик ядро операционная система

Мы доберемся до отладки в Visual Basic в главе 7, но знайте, что интерфейс р-кода Visual Basic не документирован. Не будем вникать в отладочные интерфейсы Java и сценариев, эти темы выходят за рамки данной книги. Дополнительную информацию по отладке и профилированию Microsoft JVM ищите в разделе "Debugging and Profiling Java Applications" (Отладка и профилирование приложений Java) на MSDN. Набор таких интерфейсов весьма богат и разнообразен и позволяет полностью управлять работой JVM. Информацию о написании отладчика сценария можно найти в разделе MSDN "Active Script Debugging API Objects" (Активные объекты отладочных API-сценариев). Подобно JVM, объекты отладчика сценариев обеспечивают богатый интерфейс для сценариев доступа и документирования.

Отладочный API Win32 использует удивительно много программ. К ним относятся: отладчик Visual C++, который подробно рассматривается в главах 5 и 6; отладчик Windows (WinDBG), который обсуждается в следующем разделе (посвященном отладчику режима ядра); программа BoundsChecker фирмы Compuware NuMega; программа Platform SDK HeapWalker; программа Platform SDK Depends; отладчики Borland Delphi и C++ Builder, а также символический отладчик NT Symbolic Debugger (NTSD). Я уверен, что их намного больше.

3. Отладчики режима ядра


Отладчики режима ядра находятся между CPU и операционной системой. Это означает, что, когда вы останавливаете отладчик режима ядра, операционная система также полностью останавливается. Нетрудно сообразить, что переход операционной системы к резкому останову полезен, когда вы работаете с таймером и над проблемами синхронизации. Все-таки, за исключением одного отладчика, о котором будет рассказано ниже (в разделе "Отладчик SoftlCE" данной главы), нельзя отлаживать код пользовательского режима с помощью отладчиков режима ядра.

Отладчиков режима ядра не так много. Вот некоторые из них: Windows 80386 Debugger (WDEB386), Kernel Debugger (1386KD), WinDBG и SoftlCE. Каждый из этих отладчиков кратко описан в следующих разделах.

3.1 Отладчик WDEB386


WDEB386 - это отладчик режима ядра Windows 98, распространяемый в составе Platform SDK. Этот отладчик полезен только для разработчиков, пишущих драйверы виртуальных устройств Windows 98 (VxD). Подобно большинству отладчиков режима ядра для операционных систем Windows, отладчик WDEB386 требует для работы две машины и нуль-модемный кабель. Две машины необходимы потому, что часть отладчика, которая выполняется на целевой машине, имеет ограниченный доступ к ее аппаратным средствам, так что он посылает свой вывод и получает команды от другой машины.

Отладчик WDEB386 имеет интересную историю. Он начинался как внутренний фоновый инструмент Microsoft в эпоху Windows 3.0. Его было трудно использовать, и он не имел достаточной поддержки для отладки исходного кода и других приятных свойств, которыми нас испортили отладчики Visual C++ и Visual Basic.

"Точечные" (DOT) команды - наиболее важная особенность WDEB386. Через прерывание INT 41 можно расширять WDEB386 с целью добавления команд. Эта расширяемость позволяет авторам VxD-драйверов создавать заказные отладочные команды, которые дают им свободный доступ к информации в их виртуальных устройствах. Отладочная версия Windows 98 поддерживает множество DOT-команд, которые позволяют наблюдать точное состояние операционной системы в любой точке процесса отладки.

3.2 Отладчик I386KD


Windows 2000 отличается от Windows 98 тем, что реально действующая часть отладчика режима ядра является частьюNTOSKRNL. EXE - файла главного ядра операционной системы Windows 2000. Этот отладчик доступен как в свободных (выпускных), так и в проверенных (отладочных) конфигурациях операционной системы. Чтобы включить отладку в режиме ядра, установите параметр загрузчика /DEBUG в BOOT. INI и, дополнительно, опцию загрузчика /DEBUGPORT, если необходимо установить значение коммуникационного порта отладчика режима ядра, отличающееся от умалчиваемого (СОМ1). I386KD выполняется на своей собственной машине и сообщается с машиной Windows 2000 через кабель нуль-модема.

Отладчик режима ядра NTOSKRNL. EXE делает только то, что достаточно для управления CPU, так чтобы операционная система могла быть отлажена. Большая часть отладочной работы - обработка символов, расширенные точки прерывания и дизассемблирование - выполняется на стороне 1386KD. Одно время Windows NT 4 Device Driver Kit (DDK) документировал протокол, используемый в кабеле нуль-модема. Однако Microsoft больше его не документирует.

Мощь 1386KD очевидна, если посмотреть на все команды, которые он предлагает для доступа к внутреннему состоянию Windows 2000. Знание механизма работы драйверов устройств в Windows 2000 поможет программисту следить за выводом многих команд. Не смотря на всю свою мощь, i386KD почти никогда не применяется, потому что это консольное приложение, которое очень утомительно использовать для отладок исходного уровня.

3.3 Отладчик Win DBG


WinDBG - это отладчик, который поставляется в составе Platform SDK. Можно также загрузить его с#"897008.files/image001.gif">

Рис 1. Вывод программы GFLAGS. EXE

Листинг 4-1. Пример разрушения heap-области Windows 2000

void main (void)

HANDLE hHeap = HeapCreate (0, 128, 0);

// Распределить память для блока размером в 10 байтов.

LPVOID pMem = HeapAlloc (hHeap, 0,10);

// Записать 12 байт в 10-байтовый блок (переполнение heap-области).

memset (pMem, OxAC,

);

// Распределить новый блок размером 20 байт.

LPVOID pMem2 = HeapAlloc (hHeap, 0, 20);

// Записать 1 байт во второй блок.

char * pUnder = (char *) ( (DWORD) pMem2 - 1);

*pUnder = 'P';

// Освободить первый блок. Это обращение к HeapFree будет

// инициировать точку прерывания в коде отладочной heap-области

// операционной системы.

HeapFree (hHeap, 0, pMem);

// Освободить второй блок. Заметим, что этот вызов не будет

// выдавать соообщения о неполадке

HeapFree (hHeap, 0, pMem2);

// Освободить фиктивный блок. Заметим, что этот вызов не будет

// выдавать сообщения о неполадке

}

Если установить те же флажки, что на рис.4.1, и повторить выполнение HEAPER. EXE, то будет получен следующий, более многословный вывод:

PAGEHEAP: process 0x490 created debug heap 00430000

(flags 0xl, 50, 25, 0, 0): process 0x490 created debug heap 00CF0000

(flags Oxl, 50, 25, 0, - 0): process 0x490 created debug heap 01600000

(flags Oxl, 50, 25, 0, 0): Tail fill corruption detected:at 0x01606FF0size 0x0000000Asize 0x00000010at Ox01606FFA: Attempt to reference block which is not allocated

Содержимое листинга объясняют названия флажков, установленных панелью Global Flags.

Обсуждая программу GFLAGS. EXE, я хочу указать на одну очень полезную опцию - Show Loader Snaps. Если вы установите этот флажок и выполните приложение, то увидите то, что называют снимком (snap) приложения, в котором видно, где Windows 2000 загружает DLL-файлы и как она начинает организацию импорта. Если необходимо точно видеть, что делает загрузчик Windows 2000 при загрузке приложения (особенно в том случае, когда в нем обнаружена проблема), то включение этой опции может оказаться весьма полезным мероприятием. Дополнительную информацию по снимкам загрузчика можно получить в колонке Мэта Пьетрека "Under the Hood" в сентябрьском выпуске Microsoft Systems Journal за 1999 год.

5. Автоматический запуск приложений в отладчике


Самыми трудными для отладки типами приложений являются те приложения, которые запускаются другим процессом. В эту категорию нападают службы Windows 2000 и внепроцессные (out-of-process) СОМ-серверы (СОМ out-of-process servers). Чтобы заставить отладчик прикрепиться к процессу, во многих случаях можно использовать API-функцию DebugBreak. В двух случаях, однако, эта функция работать не будет. Во-первых, она иногда не работает со службами Windows 2000. Если нужно отладить запуск службы, то вызов DebugBreak присоединит отладчик, но к тому времени, когда отладчик запустится, может быть исчерпан интервал тайм-аута службы, и Windows 2000 остановит ее. Во-вторых, DebugBreak не будет работать, когда нужно отлаживать внепроцессный СОМ-сервер. Если вы вызовете DebugBreak, обработчик СОМ-ошибок отловит исключение точки прерывания и завершит СОМ-сервер. К счастью, Windows 2000 позволяет указать, что приложение должно стартовать в отладчике. Это свойство позволяет начать отладку прямо с первой инструкции. Однако, прежде чем вы включите это свойство для службы Windows 2000, удостоверьтесь, что в этой службе сконфигурирована возможность взаимодействия с рабочим столом Windows 2000.

Свойство запуска с отладчиком можно включить двумя способами. Самый легкий - запустить утилиту GFLAGS. EXE и выбрать переключатель Image File Options (см. рис.4.1). После ввода в редактируемое поле Image File Name имени двоичного файла программы установите флажок Debugger в группе Image Debugger Options) и введите в редактируемое поле рядом с этим флажком полный путь к отладчику.

Более трудный способ: нужно вручную установить необходимые параметры з подходящие разделы реестра (с помощью редактора RegEdit). В разделе_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NTXCurrent Version\Image Tile Execution Options

создайте подраздел, имя которого совпадает с именем файла вашего приложения. Например, если имя приложения - FOO. EXE, то имя подраздела реестра тоже FOO. EXE. В этом подразделе создайте новый строковый параметр с именем Debugger. В диалоговом окне Изменение строкового параметра введите с клавиатуры полное (вместе с путем к каталогу) имя файла выбранного вами отладчика. Если вы указали GFLAGS. EXE и установили некоторые глобальные опции, то сможете заметить в ключе вашего приложения строчное значение GiobaiFiag.

Теперь при запуске вашего приложения автоматически загружается и запускается и отладчик. Опции командной строки для отладчика также можно определить в строковом параметре Debugger (вслед за именем программы отладчика). Например, для того чтобы использовать отладчик WinDBG и автоматически инициировать отладку, как только стартует WinDBG, нужно в диалоговом окне изменения строкового параметра Debugger ввести значение d: \platform sdk\bin\windbg. exe - g.

5.1 Быстрые клавиши прерываний


Иногда нужно быстро войти в отладчик. Если вы отлаживаете консольные приложения, то нажатие клавиш <Ctrl>+<C> или <Ctrl>+<Break> вызовет специальное исключение (с именем DBG_CONTROL_C). Это исключение переведет вас прямо в отладчик и позволит стартовать отладку.

Полезным свойством как Windows 2000, так и Windows NT 4 является возможность в любое время переходить в отладчик также и в GUI-приложениях. При выполнении под отладчиком нажатие клавиши <F12> приводит (по умолчанию) к вызову функции DebugBreak. Интересный аспект обработки этой клавиши заключается в том, что, даже если вы используете ее как акселератор или как-то иначе обрабатываете сообщения клавиатуры для этой клавиши, она все еще будет подключать вас к отладчику.

В Windows NT 4 быстрая клавиша прерывания <F12> назначена по умолчанию, однако в Windows 2000 вы можете сами определить, какую клавишу следует использовать для этих целей. Для чего в разделе реестра

HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\WindowsNT\CurrentVersion\AeDebug

установите для параметра userDebuggerHotKey значение кода клавиши (VK_*). Например, чтобы использовать клавишу<Scroll Lock> для подключения к отладчику, следует установить значение UserDebuggerHotKey равным 0x91. Изменения вступают в силу после перезагрузки компьютера.

Заключение


Мы рассмотрели основные черты отладки, его типы и виды, общий вопрос отладки, а также ошибки и способы их обнаружения.

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


Литература


1.      http://bibliofond.ru/view. aspx? id=553022 <http://bibliofond.ru/view.aspx?id=553022>

2.      https: // ru. wikipedia.org/wiki/%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA <https://ru.wikipedia.org/wiki/%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA>

.        http://bourabai. kz/alg/debug4. htm <http://bourabai.kz/alg/debug4.htm>

4.      Костюхин К. - ОТЛАДКА СИСТЕМ РЕАЛЬНОГО ВРЕМЕНИ. Обзор

Похожие работы на - Принцип работы отладчика ядра операционной системы

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!