Что такое отладчик. Отладка программы. Основные функции отладчика

Вот ты все кодишь, кодишь, отлаживаешь,
отлаживаешь... Стоп! А задумывался ли ты как
работает отладчик? Нет? Тогда слушай...
Начнем с того, что все семейство отладчиков
делится на отладчики приложений и
отладчики ядра. Различие в их реализации,
как правило, заключается в том, что
отладчики приложений используют Debugging API ОС
(функции, структуры), а отладчики ядра -
непосредственно отладочные возможности
процессора (регистры, команды). Очевидно,
что отладчики приложений проще в
реализации, посему с них и начнем.

Отладчики приложений

Описывать я буду Windows Debugging API. Итак, для
того, чтобы начать отладку, поток-отладчик
должен запустить отлаживаемый процесс так,
чтобы ОС знала о том, что запускаемый
процесс будет находиться под отладкой. Для
этого надо запустить отлаживаемую
программу функцией CreateProcess с параметром
dwCreationFlag равным DEBUG_ONLY_THIS_PROCESS (или DEBUG_PROCESS,
если отладчик может отлаживать несколько
процессов одновременно). Теперь отладчик
должен войти в т.н. цикл отладки. Для этого
надо войти в цикл, вызывая функцию WaitForDebugEvent
(while(WaitForDebugEvent(...)==1)) и после завершения
обработки какого-либо события отладки
вызывать ContinueDebugEvent. Итак, обобщенная схема
работы отладчика:

CreateProcess("путь_к_отлаживаемой_проге",...,DEBUG_ONLY_THIS_PROCESS,...);
while(WaitForDebugEvent(...)==TRUE)
{
обрабатываем_события(см.далее)
...
...
...

ContinueDebugEvent(...);
}

Да, кстати, выше я сказал ПОТОК-отладчик -
это важно (Microsoft recommendation:), чтобы цикл
отладки, описанный выше находился в
отдельном потоке отладчика. Иначе отладчик
будет виснуть во время ожидания событий
отладки. Но это важно для серьезных
отладчиков, а на пока можно этим не
заморачиваться (это тебе так, на будущее).
Теперь нам надо научиться получать события
отладки. Для этого в Win DAPI есть структура
DEBUG_EVENT (посмотри SDK, описывать не буду, т.к.
структура не из маленьких). Указатель на эту
структуру передается первым параметром
функции WaitForDebugEvent, а она в свою очередь
заполняет ее интересной для нас
информацией. Само событие отладки, которое
нужно/можно обрабатывать будет в элементе
DEBUG_EVENT dwDebugEventCode. Итак какие существуют
события отладки:

CREATE_PROCESS_DEBUG_EVENT - в отлаживаемом процессе
создается новый процесс (или отладчик начал
отладку уже активного процесса - нам не надо)
CREATE_THREAD_DEBUG_EVENT - соответственно, в
отлаживаемом процессе создается новый
поток
EXCEPTION_DEBUG_EVENT - в отлаживаемом процессе
возникло исключение (точка останова,
деление на ноль и т.д)
EXIT_PROCESS_DEBUG_EVENT - возникает при выходе из
отлаживаемого процесса
EXIT_THREAD_DEBUG_EVENT - возникает при выходе из
потока отлаживаемого процесса
LOAD_DLL_DEBUG_EVENT - возникает при загрузке DLL в
адресное пространство
OUTPUT_DEBUG_STRING_EVENT - возникает, когда
отлаживаемая программа вызывает OutputDebugString
UNLOAD_DLL_DEBUG_EVENT - отлаживаемый процесс
выгружает DLL
RIP_INFO - (только для Win98), сообщение об
ошибочной ситуации (например закрытие
недопустимых дескрипторов, т.е. ошибки, не
настолько смертельные, как при EXCEPTION_DEBUG_EVENT)

При возникновении событий отладки
существует множество нюансов, не описанных
мной. Например CREATE_PROCESS_DEBUG_EVENT и
CREATE_THREAD_DEBUG_EVENT возникают ПЕРЕД тем как
процесс или поток начнут выполняться.
Почитай более подробно в MSDN, т.к. сегодня мы
создаем ОЧЧЧЕНЬ простой отладчик.

Ну вот, кое-что уяснили, теперь напишем что-то
похожее на отладчик:

Вот и все. Компиляй, запускай. Я думаю ты
догадался, что в качестве параметра этому
отладчику следует передать путь к
отлаживаемой программе. Теперь ты знаешь
примитивнейшие основы работы отладчика
приложений под Win. Написанный в качестве
примера отладчик даже не столько отладчик,
сколько прога, отображающая события
отладки. Для создания настоящего отладчика
требуется большое усердие и желание. Если
тебя заинтересовала эта тема, прочти, что
написано об отладке в MSDN и вперед!

Отладчики ядра

Плавно подходим к отладчикам ядра.. Оооооо!
Это очень интересно и настолько же сложно.
Как я уже говорил, отладчики ядра
используют ресурсы процессора. Сразу скажу,
что я ограничусь описанием этих ресурсов и
описанием их использования. Примера проги
не будет 🙁 В современных процах Intel (и
совместимых с ними), начиная с 80386 нам
доступны 8 отладочных регистров (DR0-DR7),
позволяющие ставить контрольные точки на
чтение/запись областей памяти и портов
ввода/вывода (начиная с Pentium). И это круто,
скажу я тебе! Всего контрольных точек
только четыре 🙁 Ну ладно, рассмотрим
отладочные регистры DR0-DR7. Наиболее важным
из них является DR7, т.к. именно он является
управляющим регистром отладки, позволяющим
координировать работу точек останова. Да,
кстати все восемь отладочных регистров 32-битные.
Рассмотрим подробнее регистр DR7:

биты 31-30: поле LEN для т/о (точки останова) 3
биты 29-28: поле R/W для т/о 3
биты 27-36: поле LEN для т/о 2
биты 25-24: поле R/W для т/о 2
биты 23-22: поле LEN для т/о 1
биты 21-20: поле R/W для т/о 1
биты 19-18: поле LEN для т/о 0
биты 17-16: поле R/W для т/о 0

поле LEN задает длину т/о:
00 - 1 байт
01 - 2 байта
10 - 3 байта
11 - 4 байта

поле R/W задает условие срабатывания т/о:
00 - исполнение команды
01 - запись данных
10 - обращение к порту ввода/вывода (если 3-й
бит регистра CR4 равен 1), иначе не определено
11 - чтение/запись

биты 15-14: 0-0 (равны нулю)
бит 13: при его установке любое обращение к
отладочным регистрам (даже из 0 кольца)
вызывает исключение
биты 12-10: 0-0-1
биты 9-8: 1-1 (а здесь уже Intel recommendation 🙂
бит 7: 1 - включить т/о 3
бит 5: 1 - включить т/о 2
бит 3: 1 - включить т/о 1
бит 1: 1 - включить т/о 0
биты 8,6,4,2,0: то же, что и 7,5,3,1, но сбрасывается
при каждом переключении задачи (актуально
для защищенного режима, в реальном режиме
эти пары регистров равноценны)

Регистры DR0-DR3 задают линейные адреса
четырех точек останова (0-3 соответственно).
Тут есть некоторые пометки: если размер т/о -
слово, то адрес толжен быть четным,
если двойное слово, то адрес должен быть
кратный четырем.
И наконец регистр DR6 отображает состояние
отладки:

биты 31-16: все выставить в единицу
бит 15: если 1, то исключение вызвано
переключением задач (опять же, актуально
для защищенного режима)
бит 14: устанавливается при трассировке
бит 13: устанавливается, если следующая
команда обращается к любому отладочному
регистру (бит 13 регистра DR7 должен быть
установлен)
бит 12: 0
биты 11-4: единицы
бит 3: сработала т/о 3
бит 2: сработала т/о 2
бит 1: сработала т/о 1
бит 0: сработала т/о 0

Ox-x-x, это тебе не Windows Debugging API 🙂

;Этот пример в Win не работает (и в DOS окне тоже)
mov eax, 0000000011000000110000010 ; длина т/о равна 1 байт,
ставим на чтение/запись памяти
mov ebx, 90000h ;адрес точки останова (кто прочтет/начнет
писАть - сразу пискнет)
mov dr7, eax
mov dr0, ebx

Отладчики же после установки т/о ждут
генерации int 0x1 при обращении к т/о и получая
управление творят беспредел 🙂 С портами все
точно так же, но надо сначала установить в
единицу 3-й бит регистра CR4, и задать адрес
порта в один из регистров DR0-DR3.

Из древних возможностей отладки можно
сказать о контрольных точках останова и
трассировке. Контрольная точка останова
реализуется с помощью опкода 0xCC. Встретив
его, процессор вызывает int 0x3 и запоминает в
стеке регистр флагов, регистр CS, регистр IP,
запрещает преревания (флаг FI в регистре
флагов устанавливается в 0), сбрасывает флаг
трассировки. После этого отладчик опять же
может делать с программой все что угодно. И
о трассировке. Она организуется установкой
флага TF (флаг трассировки) в единицу.
Установил TF в единицу, и процессор после
каждой команды будет вазывать int 0x1,
сохраняя в стеке регистр флагов и регистр IP
и очищая флаг TF. Хитрый отладчик
перехватывал исключение и - опять беспредел
🙂 Для отладки в реальном режиме процессора
отладчик должен был перехватывать
прерывания(исключения) 0x1 и 0x3 и
обрабатывать их по своему усмотрению. В
защищенном режиме в принципе все так же (в
смысле так же надо перехватывать 0x1 и 0x3), но
здесь при возникновении исключения
предоставляется больше информации, но
программировать в защищенном режиме
достаточно сложно. А уж в нулевом кольце
защиты Windows и подавно. Чуть не забыл сказать
об т.н. эмулирующих отладчиках. Эти
отладчики эмулируют выполнение команд
процессора отлаживаемой программы (ну и
регистры проца конечно эмулируют). С точки
зрения защиты от антиотладочного кода это
большое подспорье. Но и на эмулирующие
отладчики управа всегда найдется.

К чему пришли?..

Ну вот, теперь ты знаешь, пусть примерно,
как работают отладчики. Да, кстати, SoftIce -
отладчик ядра, а так же единственный из них,
способный отлаживать используя один комп.
"Что значит один комп?" - спросишь ты. А
это значит что остальные известные
отладчики ядра ведут отладку "по модему",
т.е. отлаживаемая система вместе с ядром
отладчика на одном компе, а управление
ядром происходит по сети, другим компом. Вот
так-то. А как правило встроенные в средства
разработки отладчики - не что иное как
отладчики приложений, причем не самые
лучшие. Что же использовать, спосишь ты меня.
Да ты и сам знаешь - SoftIce 🙂 А еще неплохой
отладчик - WinDBG. Он идет вместе с PlatformSDK. Удачи
в ловле жуков!

Компиляторы (ассемблеры) и редакторы связей.

Эти два класса программ следует объединить, т.к. в поставку любого современного компилятора входит и редактор связей.

Компилятор (ассемблер) формирует объектный код, переводя программу с языка программирования (языка ассемблера), а редактор формирует исполнимый файл, собирая объектные и библиотечные файлы и редактируя перекрестные ссылки.

Для компиляторов можно указать следующие характеристики:

Язык, с которого производится компиляция;

Диалект/стандарт языка;

Аппаратные платформы и ОС, для которых может формироваться объектный и исполнимый файл;

Наличие возможности и качество оптимизации кода;

Форматы поддерживаемых объектных, библиотечных и исполнимых файлов;

Представители: C/C++: Intel C++ Compiler, Borland C++ Compiler, Watcom C++, GNU C.

Pascal: Free Pascal, GNU Pascal.

Редакторы текстов.

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

Характеристики:

Формат и кодировка обрабатываемых файлов;

Возможность выделения лексем в тексте;

Возможность поддержки оформления текста в соответствии с парадигмами языка;

Возможность вызывать процесс компиляции прямо из редактора;

Возможность генерации части текста программы (чаще бывает не у редакторов, а у сред).

Отладчики.

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

Различают два основных типа отладчиков:

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

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

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

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

Характеристики:

Тип (режима ядра/пользовательский);

Поддержка символьной отладки (способность читать исходные коды программы и работать с ними). Набор поддерживаемых языков (сред/диалектов);

Набор отображаемой информации: регистры процессора, стек, память (режимы отображения содержимого памяти);

Поддерживаемые режимы отладки: пошаговый, с точками останова, с реакцией на события в системе;

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

- (обычно для отладчиков режима ядра) требования к аппаратной поддержке, возможность работы на «живой» системе;

Возможность анализа файлов дампа.

Представители:

Отладчики пользовательского режима: Turbo Debugger (Borland Software Corporation), Cool Debugger (Wei Bao), W32Dasm, AQtime, FlexTracer, GNU Debugger.

Отладчики режима ядра: i386kd/alphakd/ia64kd и WinDbg (Microsoft Corporation) (для работы в “живую” требуют 2 машины. Для обхода этого ограничения существует надстройка LiveKd (Mark E. Russinovich)), SoftIce (NuMega).

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

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

    последовательное пошаговое выполнение результирующей программы на основе шагов по машинным командам или по операторам входного языка;

    выполнение результирующей программы до достижения ею одной из заданных точек останова (адресов останова);

    выполнение результирующей программы до наступления некоторых заданных условий, связанных с данными и адресами, обрабатываемыми этой программой;

    просмотр содержимого областей памяти, занятых командами или данными результирующей программы.

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

Дальнейшее развитие отладчиков связано со следующими принципиальными моментами:

Появлением интегрированных сред разработки;

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

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

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

Второй шаг позволил значительно расширить возможности сред» " |(отладки. Теперь для них не требовалось моделировать ра(нму и архитектуру соответствующей вычислительной системы. Выполнепи»-результирующей программы в режиме отладки стало возможным в юн же среде, что и в обычном режиме. В задачу отладчика входили юпм функции перевода вычислительной системы в соответствуй и цнп pi ч им перед запуском результирующей программы на отладку. Be > mi ни ом м.. функции являются приоритетными, поскольку зачастую треОукн у». i.т. .т ч системных таблиц и флагов процессора вычислительной стати

Отладчики в современных системах программирои.н.н. представляют собой модули с развитым интерфейсом пот, юн.и.-и .. работающие непосредственно с текстом и модулями m -одном программы. Многие их функции интегрированы с функциями нч< ют... редакторов исходных текстов, входящих в сое urn in. .«mi программирования.

Рассмотрим возможности отладчика системы npoi раммпроп.мм,. Delphi. Это мощный отладчик, встроенный непосрсд» ними... ,-интегрированную среду разработки. Набор поддерживаемы - им .\, п \ """

включает все, что можно ожидать от отладчика: трассировку и пот. и

выполнение, установку точек останова, добавление и про, м. .,. контролируемых значений, вычисление и модификацию дат п.I- > > .-просмотр содержимого стека.

Точки останова (breakpoints ) или просто ociaiumi.i, пот..,.,..-при выполнении определенных условий приостановим. p,.i.,. t , программы. Чаще всего точки останова размещаклся в onpi д. п. пи -строке кода, при этом останов происходит в тот момеш, кпд., д.мт. , строка должна начать выполняться. Такой останов можно у< ми,.п..., например, щелкнув слева от строки кода. Если ш-ш.- ..м.» < проанализировать поведение программы внутри опред.-тч...,.,

процедуры или функции, достаточно просто установить 1 очку о(ми

ое первой строке.

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

Современный Гуманитарный Университ

Современный fyw

у» мпиин. Типичным случаем применения такой точки останова будет прпнорка кода внутри цикла. Вероятно, вы не захотите останавливать и мини, запускать программу всякий раз, когда выполняется цикл - а это происходит сотни, а то и тысячи раз. Вместо того, чтобы непрерывно производить повторный запуск программы, можно установить точку мошнова по достижении какой-то переменной определенного значения.

Точка останова по обращению к данным . Этот тип точки останова приостанавливает выполнение программы при модификации определенного участка памяти. Он применяется для низкоуровневой о| падки, когда отслеживаются ошибки присвоения значений переменным. Можно также ввести начальный"адрес области памяти, ююрую i poOyei ся контролировать, и ее размер (в байтах). Устанавливая необходимый размер, можно контролировать переменную любого типа I» char (1 байт) и Integer (4 байта) до массива или записи произвольного размера. Как и в случае точки останова по условию, можно ввести выражение, которое будет критерием останова при изменении области памяти. Это позволяет выявлять ошибки, которые проявляются только после n-го обновления значения переменной.

Точка останова по адресу . Останов по адресу реализуется, когда выполняется инструкция, находящаяся в памяти по заданному адресу. Эти точки обычно устанавливаются-; если невозможно установить обычную точку останова в определенной строке кода из-за отсутствия исходного кода для соответствующего модуля. Как и в случае других видов точек останова, можно задать условия приостановки выполнения программы.

Точка останова по загрузке модуля , как следует из названия останавливает выполнение отлаживаемой программы при загрузке указанного модуля.

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

Пошаговое выполнение программы . Программу можно выполнять последовательно, строка за строкой, используя команды Step Over или Trace Into (по умолчанию клавиши и соответственно). Команда Trace Into при выполнении программы обеспечивает вход в вызываемые процедуры и функции, а команда Step Over немедленно их выполняет и представляет как одно действие. Этими опциями удобно пользоваться после останова программы в каком-то месте ее текста.

Можно также дать указание Delphi выполнять программу до того места, в котором в настоящий момент находится курсор, - с помощью команды Run to Cursor (клавиша ). Эту возможность удобно

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

Использование окна инспектора данных (Watch ). Окно Watch можно использовать для контроля значений переменных по ходу выполнения программы. Программа должна находиться в режиме просмотра кода программы (т.е. выполняться какая-либо из точек останова) - только в этом случае содержимое окна Watch будет корректным. В этом окне можно ввести некоторое выражение Object Pascal или указать определенное в программе имя.

Инспекторы отладки (Debug Inspector ) представляют собой разновидность окна инспектора данных. Они обладают большими возможностями, и их легче использовать, чем окно Watch. В окне инспектора отладки можно просматривать содержимое данных, состоящих из множества индивидуальных элементов, например, таких как классы и записи.

Использование команд Evaluate и Modify . Команды Evaluate и Modify позволяют соответственно просматривать и изменять содержимое переменных, включая массивы и записи, "налету", во время выполнения приложения, в интегрированном отладчике. (Однако они не предоставляют доступ к функциям и переменным вне области видимости.)

Доступ к стеку вызовов (Call Stack ) позволяет просмотреть вызовы функций и процедур вместе с переданными им параметрами, в той последовательности, в которой они выполнялись до определенного момента выполнения программы.

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

Журнал событий (Event Log ) - это место, в которое отладчик записывает информацию о различных событиях. Типы событий, сведения о которых могут помещаться в журнал, включают запуск и останов процесса, загрузку модулей отладчиком.

Окно CPU содержит пять информационных панелей: CPU, Memory Dump, Register, Flags и Stack. С его помощью разработчик получает возможность узнать, что именно происходит в машине. Каждая из панелей позволяет во время отладки следить за важными аспектами функционирования процессора.

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

Контекстное меню окна CPU позволяет настроить внешний вид окна, просмотреть различные адреса, перейти к инструкции, выполняемой в

Современный Гуманитарный Универси ! 16

Современный Гуманитарный Университет

mi mi - ш . «и vii им i tun i , n iii t - lu -" pnyii . csi к ll |) OCMOTpy ИСХОДНОГО

кода и in i ik ir n- i m" * и-* i ч.if ч ми. м m 11"m.i потока, в котором будет

проема 11 him.111." ".i iiih|m ,| iM.iiimi i I"ll

На naiifiiii Мсмнну i Himp mii + ihi присмотреть содержимое любой области нами i и;п<м мдср + пммп мм-нч (н.пьпредставлено по-разному: как Byle, Woid, nwnHD. uwnni). :>inul<>, Double или Extended. Можно выполнить поиск и ii.immiii mi 1ред(тонной последовательности байтов, модифицирован, юнущио д.тпио и перейти к следующим, либо последовательно, липо ииюш.муя ткущие данные в качестве указателя.

Назначение папок.-и Honji.loi и I lags очевидно: в них отображаются и могут быть изменены т с poincipu и с|)лаги процессора.

На панели Stack можно просмотреть память, используемую приложением в качесто сн."ка. Можно также изменять значения и перемещаться по адресам.

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

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

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

Некоторые проблемы трудно решить даже с помощью отладчика. Например, динамические структуры данных (списки и деревья) нельзя исследовать в целом; вместо этого нужно вручную проходить по каждой связи. Есть более серьезные проблемы типа затирания памяти, которые вызваны ошибками, находящимися далеко от того места, где они проявились. В этих ситуациях мало проку от отладчиков, нацеленных на выявление таких симптомов, как «деление на ноль в процедуре p1».

Наконец, некоторые системы не могут быть «отлажены» как таковые: нельзя по желанию создать тяжелое положение больного только для того, чтобы отладить программное обеспечение сердечного монитора; нельзя послать группу программистов в космический полет для того, чтобы отладить управляющую программу полета. Такие системы должны проверяться с помощью специальных аппаратных средств и программного обеспечения для моделирования входных и выходных данных; программное обеспечение в таких случаях никогда не проверяется и не отлаживается в реальных условиях! Программные системы, критичные в отношении надежности, стимулируют исследование языковых конструкций, повышающих надежность программ и вносящих вклад в формальные методы их верификации .

Основные функции отладчика

Трассировка (англ. trace ). Пошаговое выполнение программы, позволяющее программисту точно отслеживать команды в порядке их выполнения.

Контрольные точки (англ. breakpoint ). Средство, предназначенное для того, чтобы заставить программу выполняться до конкретной строки в программе. Специальный вид контрольной точки - точка наблюдения - вызывает выполнение программы, пока не произойдет обращение к определенной ячейке памяти.

Существует множество отладчиков такие, как DEBUG, SYMDEB, CODEVIEW, NTiceSET, SUPER TRACER, TRW, Soft-ICE.

В данном разделе рассматривается отладчик Turbo Debugger .

Turbo Debugger представляет собой набор инструментальных средств, позволяющий отлаживать программы на уровне исходного текста и предназначенный для программистов, использующих семейство компиляторов Borland. В пакет отладчика входят набор выполняемых файлов, утилит, справочных текстовых файлов и примеров программ.

Turbo Debugger позволяет отлаживать программы для Microsoft Windows, Windows 32s, Windows NT и DOS. Многочисленные перекрывающие друг друга окна, а также сочетание спускающихся и раскрывающихся меню обеспечивают быстрый, интерактивный пользовательский интерфейс. Интерактивная, контекстно-зависимая справочная система обеспечит подсказкой на всех стадиях работы. Кроме того, Turbo Debugger имеет полный набор средств отладки:

  • Вычисление любых выражений языка Си, C++, Pascal и Assembler.
  • Полное управление выполнением программы, включая программную анимацию.
  • Доступ на нижнем уровне к регистрам процессора и системной памяти .
  • Полные средства проверки данных.
  • Развитые возможности задания точек останова и регистрации.
  • Трассировка сообщений Windows, включая точки останова по сообщениям.
  • Обратное выполнение.
  • Поддержка удаленной отладки, в том числе для Windows.
  • Полная поддержка объектно-ориентированного программирования, включая просмотр классов и проверку объектов.
  • Макрокоманды в виде последовательности нажатий клавиш, ускоряющие выполнение команд.
  • Копирование и вставка между окна ми и диалогами.
  • Контекстно-зависимые меню.
  • Возможность отладки больших программ.
  • Диалоговые окна, позволяющие вам настроить параметры отладчика.
  • Возможность отладки 16- и 32-разрядных программ Windows (для 32-разрядной отладки имеется отладчик TD32).
  • Обработка исключительных ситуаций операционной системы, а также С и С++.
  • Сохранение сеанса.
  • Поддержка нитей для мультинитевого программирования Windows NT.
  • Возможность подключения готовых к выполнению в Windows процессов.

Запуск отладчика После компиляции и компоновки программ с включением отладочной информации можно начать процесс отладки, запустив Turbo Debugger и загрузив с ним программу. При этом можно использовать один из трех отладчиков: TD.EXE для отладки 16-разрядных приложений DOS, TDW.EXE для отладки 16-разрядных приложений Windows и TD32.EXE для отладки 32-разрядных приложений Windows.
При запуске Turbo Debugger из командной строки можно задать параметры запуска и режимы отладки. Эта командная строка имеет следующий синтаксис:

TD TDW TD32 [параметры] [имя_программы [аргументы]]

При выполнении TDW (или TD32 в Windows 32s) отладчик открывает полноэкранное текстовое окно. Однако, в отличие от других приложений, вы не можете использовать в Turbo Debugger клавиши Windows Alt+Esc или Ctrl+Esc, то есть смена задач здесь запрещена. Однако в Windows NT TD32 активизирует окно с командной подсказкой, и доступны все обычные средства приложения Windows.

В процессе отладки управление периодически передается между программой и отладчиком. Когда управление передается Turbo Debugger, он может использовать свои средства для поиска по исходному коду и структурам данных программы и выявления причины неправильного выполнения программы. Для этого можно использовать меню и окна отладчика. Отладчик предоставляет много способов управления выполнением программы:

  • выполнять программу по шагам (по одной машинной инструкции или строке исходного кода);
  • выполнять как один шаг вызовы функций;
  • выполнять программу до заданного места;
  • выполнять программу до возврата из текущей функции;
  • трассировать программу;
  • выполнять программу в обратном направлении;
  • выполнять программу до точки останова;
  • выполнять программу до появления определенного сообщения Windows;
  • приостанавливать программу при возникновении исключительной ситуации С++ или Си.

При выполнении программы можно получить доступ к отладчику. Это полезно использовать, когда в программе не установлены точки останова. Если при возврате в Turbo Debugger вы увидите окно CPU без соответствующих программе инструкций, то возможно вы находитесь в коде ядра Windows. При этом следует установить точку останова в том месте, где должна выполняться ваша программа.

Отладчик SoftIce SoftIce - это универсальный отладчик, которым можно отладить любой код, включая подпрограммы прерывания и драйверы ввода-вывода. SoftIce состоит из отладчика уровня ядра (kernel mode debugger) и утилиты загрузки отладочной информации (Symbol Loader). SoftIce имеет следующие возможности:

  • Символьная отладка 32-битных приложений, отладка драйверов устройств для WIN NT, драйверов для WIN95, VxD, 16-битных программ для DOS и Windows.
  • Отладка фактически любого кода, включая подпрограммы прерывания и внутренние подпрограммы WIN 95 и WIN NT.
  • Установка точек останова на сообщения Windows, операции чтения/записи в память, чтения/записи портов ввода-вывода, прерываний.
  • Установка точек останова, срабатывающих при определенных условиях (условных точек останова), и действий, которые должны произойти при срабатывании точки останова.

Способен распознавать функции api с перечислением необходимых параметров. И многое другое

2. Параллельный и последовательный порты ЭВМ.

Порты P0-P3 являются двунаправленными портами ввода-вывода и предназначены для обеспечения обмена информацией ОМЭВМ с внешними устройствами, образуя 32 линии ввода – вывода. Каждый из портов содержит фиксатор-защелку который представляет собой 8-разрядный регистр, имеющий байтовую и однобитовую адресацию. Для установки(сброса) разрядов с помощью программного обеспечения.

Физические адреса фиксаторов P0-P3 составляют для:

Р0 -80Н, при битовой адресации 80Н-87Н;

Р1 -90Н, при битовой адресации 90Н-97Н;

Р2 -A0Н, при битовой адресации А0Н-А7Н;

Р3 -B0Н, при битовой адресации B0Н-B7Н;

Последовательный порт ОМЭВМ может использоваться в виде регистра сдвига для расширения ввода-вывода или в качестве универсального приемопередатчика с фиксированной или переменной скоростью последовательного обмена и возможностью дуплексного включения. Последовательный порт может принимать очередной байт, даже если принятый до этого байт не был прочитан из регистра приемника.

Последовательный порт может работать в 4-х режимах:

В режиме 0 информация передается и принимается через ввод приемника RxD. Через выход передатчика TxD выдаются импульсы синхронизации, стробирующие каждый передаваемый или принимаемый бит информации.

В режиме 1 информация передается через выход передатчика TxD и принимается через вход приемника RxD

В режиме 2 информация передается через выход передат-TxD принимается через вход приемника RxD. Формат посылкики – 11 бит. Частота приема и передачи в режиме 2 задается программно и может быть равна f BQ /32 или fno/64.

Режим 3 полностью идентичен режиму 2 за исключением параметров частоты приема и передачи, которые в режиме 3 задаются Т/С 1. Схема синхронизации и временные диаграммы, иллюстрирующие работу последовательного порта, показаны на рис. 40.

Регистр управления (SCON) предназначен для приема и хранения кода 8-битного слова, управляющего последовательным интерфейсом. Обозначение разрядов регистра SCON приведено в табл. 24. Все разряды регистра SCON программно доступны по записи («0» и «1») и чтению.