ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
Часть 8 Глава 5. Управление выполнением программы При отладке программы вы обычно выполняете части программы и проверяете, что в точках останова она ведет себя правильно. Турбо отладчик для Windows предоставляет вам много способов управления выполнением программы. Вы можете: - выполнять одну машинную инструкцию или одну строку исходного кода; - "пропускать" вызовы процедур или функций; - выполнять непрерывную ("автоматическую") трассировку; - выполнять программу, пока текущая процедура или функция не возвратит управление в вызывающую программу; - выполнять программу до определенного адреса; - выполнять программу до точки останова; - повторно выполнять программу. Сеанс отладки состоит из чередующихся периодов работы отладчика TDW и вашей программы. Когда работает отладчик, вы можете запустить вашу программу, выбрав одну из команд меню Run (Выполнение), или нажав эквивалентную ей оперативную клавишу. При выполнени и программы отладчик запускается, когда будет выполнен заданный участок вашей программы, когда вы прерываете выполнение с помощью специальной последовательности клавиш, или она приостанавливает выполнение, когда Турбо отладчик TDW встретит точку останова . В данной главе мы покажем вам, как можно проверить состояние программы, когда управление получает Турбо отладчик TDW. Мы обучим вас различным способам выполнения частей вашей программы, а также покажем вам, как можно прервать ее выполнение. Наконец, мы п еречислим способы, с помощью которых можно восстановить сеанс отладки (той же или другой программы). Анализ текущего состояния программы "Состояние" вашей программы включает в себя следующие элементы: - аргументы командной строки для этой программы; - стек активных функций или процедур; - текущее положение в исходном или машинном коде; - значения регистров; - содержимое памяти; - причину, по которой отладчик остановил выполнение вашей программы; - значение переменных вашей программы. О том, как проверить и изменить значения переменных и данных вашей программы подробнее рассказывается в Главе 6. В следующих разделах описываются окно Variables (Переменные), окно Stack (Стек), локальные меню областей глобальных и статических переменных, команда Origin (Начало) и команда Get Info (Получение информации). Окно Variables В этом окне показаны все переменные, которые доступны из текущего места программы. Его можно использовать, чтобы найти переменные, написание имен которых вы не помните. Для дальнейшего анализа или изменения их значений можно использовать команды локальны х меню. Это окно можно также использовать для проверки переменных, локальных по отношению к любой вызванной функции. Й[ю]НVariablesНННННННННННННННННННННННННННННННННН» є TPDEMO.SHORESULTS @7129:01fA є є TPDEMO.INIT @7129:0402 є є TPDEMO.PROCESSLINE @7129:04B5 є є TPDEMO.GETLINE @7129:05A5 є є TPDEMO.PARMSONHEAP @7129:0651 є є TPDEMO.NUMLINES 1 ($1) є є TPDEMO.NUMWORDS 0 ($0) є єІ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±є є CH 'A' є є ISLETTER True є є S 'ABC DEF' є є I 1 ($1) є є WORDLEN 28969 є ИНННННННННННННННННННННННННННННННННННННННННННННННј Рис. 5.1 Окно Variables При отладке программы на Турбо Паскале переменные для Windows не будут упорядочиваться по алфавиту. Окно Variables (Переменные) можно открыть, выбрав в основном меню команду ViewіVariables (ОбзоріПеременные). Окно Variables содержит две области: - Область глобальных переменных, которая находится вверху, показывает все глобальные идентификаторы вашей программы. - Область статических переменных (внизу) показывает все статические переменные (идентификаторы) текущего модуля, которым является модуль, соответствующий текущему адресу программы (CS:IP), и все идентификаторы, локальные по отношению к текущей функции. В обеих областях выводится имя переменной (слева) и ее значение (справа). Если Турбо отладчик TDW не может найти никакой информации о типе данных идентификаторов, то он выводит четыре вопросительных знака (????). Как и во всех других локальных меню, нажатие клавиш Alt-F10 приводит к выводу локального меню области глобальных данных. Если разрешено использование сокращений с клавишей Ctrl, то для доступа к команде можно нажать клавишу Ctrl с первой буквой описанной команды. Если ваша программа содержит функции, которые выполняют рекурсивные вызовы, или вы хотите просмотреть переменные, локальные по отношению к вызванной функции, то вы можете проверить значение конкретных локальных данных функции. Сначала с помощью команды V iewіStack (ОбзоріСтек) создайте окно Stack (Стек), затем переместите подсветку на вызов нужной функции. Затем нажмите клавиши Alt-F10 для выбора команды Locals (Локальные). При этом в области статических данных окна Variables (Переменные) выведутся значе ния для данного конкретного экземпляра функции. Локальное меню области глобальных переменных В этом локальном меню имеется три команды: Inspect (Проверка), Change (Изменение) и Watch (Просмотр). ЪДДДДДДДДДДДї іIspect і Проверка іChange і Изменение іWatch і Просмотр АДДДДДДДДДДДЩ Команда Inspect Данная команда открывает окно Inspector (Проверка), в котором показано значение выбранной глобальной переменной. Если переменная, которую необходимо проверить, является именем функции, в окне будет показан ее исходный текст, либо (если исходный текст недоступен) в окне процессора (CPU) будет показан дисассемблированный код. Примечание: Работа с окном Inspector более подробно описана в Главе 6. Если имеется локальная переменная, имя которой заменяет имя проверяемой глобальной переменной, будет показано значение глобальной переменной, а не локальной. Такое поведение немного отличается от обычного поведения окна Inspector, которое обычно показыва ет значение переменной, связанное с текущей точкой программы (CS:IP). Благодаря этому, пользователь может просматривать значения глобальных переменных, имена которых используются и для локальных переменных. Команда Change Данная команда заменяет значение выбранной (выделенной) глобальной переменной значением, которое вводит пользователь в окне диалога Change. Турбо отладчик TDW выполняет любое необходимое преобразование типов данных точно так же, как если бы для изменения значения использовался оператор присваивания исходного языка. Примечание: Более подробная информация о присваивании и преобразовании типов данных приведена в Главе 9. Кроме этого, можно изменить значение выбранной переменной, просто открыв окно Inspector и начав вводить новое значение. При этом появляется такое же диалоговое окно, как если бы сначала была выбрана команда Change. Команда Watch Эта команда открывает окно Watches (Просмотр) и помещает в него текущее выбранное (выделенное) имя глобального идентификатора. Данная команда просто помещает в окно Watches строку символов. Примечание: Информацию об окне Watches см. в Главе 6. Окно Watches не отслеживает, является ли переменная глобальной или локальной. Если в окно вы поместили командой Watch глобальную переменную, а затем вам встретится локальная переменная с тем же именем, то пока вы будете находиться в блоке локальной перем енной, последняя будет иметь преимущество. Другими словами, окно Watches всегда показывает значение переменной с точки зрения текущего исполнительного адреса программы (CS:IP). Локальное меню области статических переменных Для вывода локального меню области статических переменных нажмите клавиши Alt-F10. Если разрешено использование сокращений с клавишей Ctrl, то для доступа к команде можно нажать клавишу Ctrl с первой буквой нужно команды. ЪДДДДДДДДДДДї іIspect і Проверка іChange... і Изменение іWatch і Просмотр іShow... і Вывод АДДДДДДДДДДДЩ Область статических переменных содержит четыре команды локального меню: Inspect (Проверка), Change (Изменение), Watch (Просмотр) и Show (Вывод). Команда Inspect Команда Inspect (Проверка) открывает окно проверки (окно Inspector), в котором выводится содержимое подсвеченного в данный момент локального идентификатора. Примечание: Более подробно о поведении окна проверки рассказывается в Главе 6. Команда Change Команда Change (Изменение) изменяет значение выбранного в данный момент (подсвеченного) локального идентификатора на то значение, которое вы введете в ответ на подсказку. Турбо отладчик TDW выполняет все необходимые преобразования типов данных так же, ка к это делается в операторе присваивания в используемом языке. Примечание: Более подробно о присваивании и преобразовании типов данных рассказывается в Главе 9. Вы можете также изменить значение текущего (подсвеченного) идентификатора просто начав вводить новое значение. Когда вы сделаете это, появляется такая же подсказка, как и после ввода команды Change. Команда Watch Открывает окно Watches и помещает в него текущее выбранное (выделенное) имя статического или локального идентификатора. Примечание: Более подробно работа с окном Watches описана в Главе 6. Команда Show При выборе команды Show (Вывод) появляется окно диалога Local Display, позволяющее изменить область определения показываемых переменных (статические, локальные динамические или и те, и другие) и модуль, из которого эти переменные выбираются. В окне диалога вам предлагается сделать выбор при помощи следующих селективных переключателей: Static Показывать только статические переменные. Auto Показывать только локальные переменные данного окна. Both Показывать оба типа переменных (по умолчанию). Module Изменить текущий модуль. Выводит окно диалога со списком модулей программы, в котором вы можете выбрать новый модуль. Й[ю]ННННННLocal DisplayНННННННННННННН» є ( ) Static OK є є ( ) Auto Cancel є є () Both Help є є ( ) Module ±±±±±± є є є ИННННННННННННННННННННННННННННННННННННј Рис. 5.2 Диалоговое окно Local Display Окно Stack Окно Stack (Стек) вы можете создать с помощью команды ViewіStack (ОбзоріСтек). В окне стека выводится список всех активных процедур и функций. Первой в списке указывается последняя вызванная процедуры, за которой следует вызвавшая ее процедура и предыдущ ая процедура, и так до самой первой процедуры или функции программы (основная (main) программа в Паскале). Для любой процедуры или функции можно видеть значение каждого параметра, с которым она вызывалась. Й[ю]ННStackНННННННННННННН3НННН[][]Н» єTPDEMO.PROCESSLINE.ISLETTER('A') є єTPDEMO.PROCESSLINE('ABCDEF')ІІІІІІІІє є є є є є є є є И±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±Ѕ Рис. 5.3 Окно Stack Для программ, реализующих методы объектно-ориентированного программирования, окно Stack показывает имена методов объектов, перед которыми указывается имя объекта, определяющего метод или функцию: SHAPES.ACIRCLE(174, 360, 75.0) { Турбо Паскаль } Для вывода локального меню окна стека нажмите клавиши Alt-F10 или клавишу Ctrl с первой буквой желаемой команды (что позволит получить непосредственный доступ к команде). Локальное меню окна Stack Локальное меню окна Stack содержит две команды: Inspect (Проверка) и Locals (Локальные переменные). ЪДДДДДДДДДДДДї іInspect і Проверка іLocals і Локальные переменные АДДДДДДДДДДДДЩ Команда Inspect Команда Inspect (Проверка) открывает окно Module (Модуль), позиционированное на активную строку в текущей подсвеченной функции. Если подсвеченная функцию находится в вершине списка (это последняя вызванная функция), то в окне Module показывается текущий адрес программы (CS:IP). Если посвечена одна из функций, которые вызывали последнюю функцию, то окно позиционируется на ту строку в функции, которая будет выполняться после того, как вызываемая функция возвратит управление. Вы можете также вызвать эту команду, позиционировав подсветку на функции и нажав клавишу Enter. Команда Locals Команда Locals (Локальные переменные) открывает окно Variables (Переменные), в котором выводятся идентификаторы, локальные по отношению к текущему модулю, а также идентификаторы, локальные по отношению к подсвеченной в данный момент функции. Если процеду ра вызывает рекурсивно сама себя, то в окне стека имеется несколько экземпляров данной процедуры. С помощью позиционирования подсветки на процедуру, данная команда позволяет вам просматривать локальные переменные для данного экземпляра. Команда локального меню Origin Окно Module и область Code (Код) окна CPU (Центральный процессор) содержат в составе локального меню команду Origin (Начало). Команда Origin позиционирует курсор по текущему адресу программы (CS:IP). Это может оказаться очень полезным, когда вы просмотре ли вашу программу и хотите вернуться обратно к тому месту, где она остановилась. Анализ состояния выполнения: команда Get Info Й[ю]ННННSystem InformationННННННННННННННННННН» єProgram: C:\TCW\TCWDEMO.EXE є єStatus: Window message breakpoint at wndprocє є є є______Memory____ ______EMS__________ є є DOS : 139Kb DOS: : 32Kb є є Debugger: 249Kb Debugger : 272Kb є є Symbols : 1Kb Program : 16Kb є є Program : 249Kb Avaliable: 2016Kb є є Avaliable: 0Kb є є є є User Interrupt: 00h 18h 23h 24h є є є є DOS Version : 5.00 є є BreakPoints : Software є є 7-9-1988 12:45 pm є є OK є є ±±±± є ИННННННННННННННННННННННННННННННННННННННННННННј Рис. 5.4 Текстовое окно Get Info Debugger - отладчик; Symbols - идентификаторы; Program - программа; Memory - память; EMS - расширенная память; Avaliable - доступно памяти; User interrupt - прерывание пользователя; Status - состояние; Stopped at... - остановлено на...; DOS Version - вер сия DOS; BreakPoints - точки останова; Software - программные. Таким образом. в окне системной информации вы можете видеть следующее: - имя отлаживаемой программы; - описание причины ее остановки; - информацию о глобальной памяти в системе;: - ноmер выполняемой версии DOS; - текущую дату и время. Информация о глобальной памяти TDW дает вам следующую информацию о глобальной памяти: Mode Режимами памяти могут быть: Large-frame EMS (Режим) (EMS-память с большим размером страничного блока), Small-frame EMS (EMS-память с малым размером страничного блока), или non-EMS (дополнительная память). Banked Объем памяти в килобайтах выше линии банка EMS (Банкируемая) (которая может быть откачана в расширенную память, если ее использует система). Not Banked Объем памяти в килобайтах ниже линии банка EMS (Не банкируемая) (которая не может быть откачана в расширенную память). Largest Наибольший непрерывный блок памяти в (Наибольший) килобайтах. Сообщения, выводимые в строке состояния Ниже приведен список сообщений, которые объясняют причину, по которой было остановлено выполнение программы, и выводятся во второй строке окна (строке состояния). Stoped at_ (остановлена на...) Программа была остановлена в результате выполнения одной из команд: RunіExecute To, RunіGo to Cursor или RunіUntil Return. Это сообщение в строке состояния выдается также при первой загрузке программы, когда выполнен код начальной загрузки, сформированны й компилятором, и маркер выполнения установлен в начале текста программы. No program loaded (программа не загружена) Туобо отладчик был запущен без какой-либо программы. Никакой код не может быть выполнен, пока не будет загружена программа или не будет ассемблированы некоторые команды с помощью команды Assemble локального меню области кода окна процессора (CPU). Control Break (нажаты клавиши Ctrl-Break) Выполнение программы было остановлено в результате нажатия вами клавиш Ctrl-Alt-SysRq. Trace (трассировка) Была выполнена одна строка исходного текста или машинная команда по команде F7 (RunіTrace). Breakpoint at_ (точка останова в...) При выполнении программы встретилась точка останова, заданная для прерывания работы программы. Текст после слова "at" означает адрес команды программы, на которой установлена точка останова. Window Message breakpoint at_ (точка останова для сообщения окна в _) Ваша программа встретила точку останова для сообщения окна, заданную для прерывания работы программы. Текст после слова "at" - это оконная процедура, которой предназначено сообщение. Terminated, exit code_ (завершена, код выхода...) Работа программы завершена. Текст после слова "code" представляет собой код выхода, возвращаемый программой Windows. Если программа не возвращает явно какого-либо определенного значения, вместо кода выхода может отображаться какое-либо не имеющее смысла число. Программа не может быть запущена, пока не будет загружена заново командой RunіProgram Reset (ВыполнениеіСброс программы). Loaded (загружена) Вы запустили Турбо отладчик TDW, указав имя программы и параметр, который предотвращает выполнение кода начальной загрузки, сформированного компилятором. Никакие команды еще не были выполнены, включая те, которые устанавливают стек и сегментные регистры. Это означает, что если вы попытаетесь проверить какие-либо данные в своей программе, вы получите неправильные значения. Step (шаг) Была выполнена одна строка исходного текста или машинная команда без показа входа в функцию с помощью команды F8 (RunіStep Over). Interrupt (прерывание) Была нажата клавиша прерывания (обычно Ctrl-Alt-SysRq), чтобы вернуть управление отладчику. В этом случае работа программы немедленно прерывается, а управление передается отладчику. Exception_ (особая ситуация) Встретилась особая ситуация процессора; это обычно случается, когда программа пытается выполнить недопустимый для данного процессора код операции. В документации по процессору Intel каждая особая ситуация описана подробно. Наиболее частой исключительной ситуацией в программах Windows является Exception 13. Это говорит о том, что ваша программа делает попытку недопустимого обращения к памяти (либо в сегментном регистре содержится неверное значение селектора, либо смещение а дреса указывает на адрес за концом сегмента). Вы должны исправить недопустимый указатель, который привел к такой проблеме. Divide by zero (деление на ноль) Ваша программа выполнила команду деления, в которой встретился нулевой делитель. Global breakpoint _ at__ (глобальная точка останова _ в _) Встретилась глобальная точка останова. Вам сообщен ее номер и адрес в программе. Меню Run Меню Run (Выполнение) содержит несколько параметров для выполнения различных частей вашей программы. Поскольку эти параметры часто используются, им соответствуют функциональные клавиши. ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДї і Run F9 і Выполнение і Go to cursor F4 і Выполнение до курсора і Trace into F7 і Трассировка і Step over F8 і Шаг с пропуском і Execute to... Alt-F9 і Выполнение до... і Until return Alt-F8 і Выполнение до возврата і Animate... і Автоматизировать і Back trace Alt-F4 і Обратная трассировка і Instruction trace Alt-F7 і Трассировка инструкций іДДДДДДДДДДДДДДДДДДДДДДДДДДДі і Arguments... і Аргументы і Program reset Ctrl-F2 і Сброс программы АДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ Команда Run [F9] Команда Run (Выполнение) запускает вашу программу на выполнение. При наступлении одного из следующих событий управление передается отладчику. - ваша программа завершила выполнение; - обнаружена точка останова с действием прерывания; - вы прервали выполнение с помощью клавиш Ctrl-Break. Команда Go to Cursor [F4] Команда Go to Cursor (Перейти к курсору) выполняет программу до той строки, где находится курсор (в текущем окне Module (Модуль) или области Code окна CPU (Центральный процессор)). Если текущим окном является окно Module, курсор должен находиться на стро ке исходного кода внутри функции. Команда Trace Into [F7] Команда Trace Into (Трассировка вглубь) выполняет одну строку исходного кода или машинную инструкцию. Если текущая строка содержит вызов процедуры или функции, то Турбо отладчик выполняет трассировку этой процедуры. Однако, если текущим окном являетс я окно CPU (Центральный процессор), то выполняется одна машинная инструкция. Турбо отладчик TDW интерпретирует методы объектов и как все другие процедуры и функции. Клавиша F7 позволяет трассировать их исходный код (если он доступен). Команда Step Over [F8] Команда Step Over (Шаг с пропуском) выполняет одну строку исходного кода или машинную инструкцию, минуя трассировку вызываемой процедуры или функции. При этом обычно выполняется одна строка исходного текста программы. Однако, если текушим окном является окно CPU (ЦП), то выполняется только одна машинная инструкция. Если вы выполняете эту команду для одной исходной строки, Турбо отладчик TDW интерпретирует любой вызов процедуры или функции на этой строке, как часть самой строки, поэтому при завершении вы не окажетесь в начале одной из этих функций. Вместо этого вы п ерейдете к следующей строке текущей подпрограммы или к предыдущей программе, которая вызвала данную. Если вы выполняете эту команду для одной машинной инструкции, Турбо отладчик TDW интерпретирует некоторые инструкции, как одну инструкцию, даже они приводят к выполнению нескольких инструкций. Приведем полный список инструкций, которые Турбо отладчик TDW интерпретирует, как одну инструкцию: CALL Вызов подпрограммы (ближний или дальний). INT Вызов прерывания. LOOP Управление циклом (CX - счетчик). LOOPZ Управление циклом (CX - счетчик). LOOPNZ Управление циклом (CX - счетчик). Шаг с пропуском выполняется также для префиксов REP, REPNZ или REPZ, за которыми следуют инструкции CMPS, CMPSW, LODSB, MOVS, MOVSB, MOVSW, SCAS, SCASB, SCASW, STOS, STOSB или STOSW. Команда RunіStep Over (ВыполнениеіШаг с пропуском) интерпретирует вызов метода объекта как один оператор, м выполняет для него шаг с пропуском, как при любом другом вызове процедуры или функции. Команда Execute To... [Alt-F9] Команда Execute To (Выполнение до...) выполняет вашу программу до адреса, который вы ввели в ответ на подсказку в диалоговом окне. Программа может не достичь этого адреса, если встречается точка останова или вы прерываете выполнение. Команда Until Return [Alt-F8] Команда Until Return (Выполнение до возврата управления) выполняет текущую процедуру или функцию, пока она не возвратит управление вызывающей программе. Это полезно использовать при двух обстоятельствах: если вы случайно вошли в процедуру или функцию, вы полнение которой вас не интересует (с помощью команды RunіTrace (Выполнениеі Трассировка) вместо команды RunіStep (ВыполнениеіШаг)), или когда вы определили, что текущая функция работает правильно, и не хотите медленно проходить ее оставшуюся часть. Команда Animate... Команда Animate... (Автоматизировать) выполняет непрерывную последовательность команд Trace (Трассировка). Это позволяет вам наблюдать за текущим адресом в исходном коде и видеть изменение значений переменных. Прервать выполнение данной команды можно наж атием любой клавиши. После выбора команды RunіAnimate (ВыполнениеіАвтоматизировать) вам выведется подсказка для ввода значения интервала временной задержки между последовательными трассировками (в десятых долях секунды). По умолчанию используется значение 3. Команда Back Trace Если вы выполняете трассировку программы (с помощью оперативных клавиш F7 или Alt-F7), то данная команда изменяет порядок выполнения на обратный. Это средство удобно использовать, если вы проскочили место предполагаемой ошибки и хотите вернуться к этой т очке. Данная команда позволяет вам выполнить программу "в обратном порядке" по шагам или до заданной (подсвеченной) точки в области инструкций окна Execution History (Протокол выполнения). Предупреждение: Здесь имеются некоторые ограничения. См. делее раздел "Область инструкций". Обратное выполнение всегда доступно в окне CPU. Однако вы можете выполнять исходный код в обратном порядке только в том случае, если включено (On) средство полного протоколирования (для вывода окна Executuion History (Протокол выполнения) и установки пер еключателя локального меню Full History (Полный протокол) в значение ON используйте команду ViewіExecution History). Если вы не находитесь в окне CPU, и кодом не является библиотека DLL, которую вы выбрали для отладки, TDW не выполняет в обратном порядке вызываемый вашей программой код Windows. Команда Instruction Trace [Alt-F7] Команда Instruction Trace (Трассировка инструкций) выполняет одну инструкцию. Ее можно использовать, когда вы хотите трассировать прерывание, или когда вы находитесь в окне Module (Модуль) и хотите выполнять трассировку процедуры или функции, которая нах одится в модуле без отладочной информации (например, библиотечной подпрограме). Так как вы больше не будете находиться в начале строки исходного теста, эта команда обычно переводит вас в окно CPU (Центральный процессор). Команда Arguments... Данная команда позволяет вам задать новые аргументы программы. Более подробно это обсуждается далее. Команда Program Reset [Ctrl-F2] Команда Program Reset (Сброс программы) перезагружает отлаживаемую вами программу с диска. Ее можно использовать в следующих случаях: - когда выполнение "зашло слишком далеко", то есть пройдено то место, где имеется ошибка; - когда ваша программа завершила работу и вы хотите запустить ее снова; - если вы работаете в окне CPU, приостановили выполнение программы с помощью Ctrl-Alt-SysRq и хотите завершить ее и начать сначала. - если вы уже загрузили прикладную программу, начали отладку с одной или более библиотек динамической компоновки (DLL) и хотите отладить эти DLL. Если вы находитесь в окне Module или CPU, то отладчик устанавливает маркер текущей строки на начало программы, но экран остается там, где вы были при выборе команды Program Reset (Сброс программы). Такое поведение облегчает установку курсора на то место, где вы были, и выполнение программы до данной строки. Если вы выбрали команду Program Reset только потому, что зашли на один оператор дальше нужного места, вы можете переместить курсор в файле исходного кода вверх на несколько строк и нажать клавишу F4, чтобы выполнить программу до этого места. В противном случае вы можете (если с помощью окна ViewіExecution History включено средство полного протоколирования Full History) выбрать вместо команды Program Reset (Сброс программы) для возврата к ранее выполненному коду команду RunіBack Trace (ВыполнениеіОбратна я трассировка). Окно Execution History В Турбо отладчике TDW имеется специальное средтство, которое называется протоколом выполнения. Это средство позволяет отслеживать каждую выполняемую инструкцию (предполагается, что вы трассируете код программы) и, кроме того, если вы хотите, фиксировать нажимаемые вами для достижения данного места программы клавиши. Вы можете просмотреть данные инструкции и выполнить их в обратном порядке (отменить), чтобы вернуться в ту точку, где содержится предполагаемая ошибка. Турбо отладчик TDW может записывать ок оло 400 инструкций. ХННExecution historyНННННННННННННН3ННН[][]НН» є7229:04F5: push ax є є7229:04F6: push bp є є7229:04F7:°call°°°TCDEMO.PROCESSLINE.ISLETTERє єІ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±є єTrace TPDEMO.122: while i <= Length(S) do є єTrace TPDEMO.125: while (i <= Length(S) anє єTrace TPDEMO.PROCESSLINE.ISLETTER: begin є АНННННННННННННННННННННННННННННННННННННННННННННј Рис. 5.5 Окно Execution History В окне Execution History (Протокол выполнения), которое открывается по команде ViewіExecution History (ОбзоріПротокол выполнения) вы можете просмотреть протокол выполнения. Данное окно содержит две области: область инструкций (вверху) и область записи клавиш (нижняя область). Область инструкций В области инструкий выводятся инструкции, которые уже выполнены и которые вы можете отменить. Выбрать нужную инструкцию можно, перемещая полосу (строку) подсветки. В протоколе выполнения отслеживаются только инструкции, которые выполняются по команде Trace Into (Трассировка вглубь) (клавиша F7) или Instruction Trace (Трассировка инструкций) (клавиши Alt-F7). Если вы не встретите ни одну из перечисленных выше (в пре дыдущих разделах) команд, там отслеживаются также инструкции, выполняемые по команде Step Over (Шаг с пропуском). Как только вы используете команду Run (Выполнение) или выполняете прерывание, протокол инструкций удаляется. (Когда вы вернетесь к трассиров ке, инструкции снова будут фиксироваться.) Обратную трассировку вызова прерывания выполнять нельзя. Если вы выполняете шаг с пропуском при вызове процедуры или функции, то вы не сможете выполнить обратную трассировку инструкций, предшествующих возврату управления. Обратная трассировка инструкций, работающих с портами, не действует, так как вы не можете отменить выполненные операции чтения или записи. Локальное меню области инструкций ЪДДДДДДДДДДДДДДДДДДДДДДДДДДї Проверка і Inspect і Обратное выполнение і Reverse execute і іДДДДДДДДДДДДДДДДДДДДДДДДДДі Полный протокол і Full history No і АДДДДДДДДДДДДДДДДДДДДДДДДДДЩ Локальное меню области инструкций содержит три команды. Команда Inspect Команда Inspect (Проверка) перемещает вас к команде, подсвеченной в области инструкций. Если это строка исходного кода, вам показывается эта строка в окне Module (Модуль). Если нет исходного кода, то открывается окно CPU (ЦП) и инструкция подсвечивается в области кода. Команда Reverse Execute Данная команда (можно также использовать оперативные клавиши Alt-F4) выполняет программу в обратном порядке до того места, которое подсвечено в области инструкций. Если вы выбрали строку исходного кода, то вы возвращаетесь в окно Module, в противном случ ае выводится окно CPU (ЦП) с подсветкой на инструкции в области кода. Предупреждение: Вы не можете выполнять в обратном порядке ту часть программы, которую вы не трассировали. Например, если вы установите точку останова и затем нажмете клавишу F9, чтобы выполнить программу до точки останова, то ваш протокол выполнения буде т потерян. В этом случае для восстановления ситуации можно использовать средство повторной отработки нажатых клавиш (окна Execution History). Для этого нужно перезагрузить программу и выполнить ее до данной точки. Предупреждение: Инструкция INT приводит к потере предыдущего протокола выполнения. Вы не можете выполнить эту инструкцию в обратном порядке, если не использовалась трассировка прерывания (клавиши Alt-F7). Следующие инструкции не приводят к потере протокола регистрации, но имеют необратимый эффект, поэтому отменить их нельзя. Если вы попытаетесь выполнить данные инструкции в обратном порядке, могут возникнуть непредсказуемые эффекты. IN INSW OUT OUTSB INSB OUTSW Команда Full History (Полный протокол) Это команда-переключатель. Если она установлена в состояние On (Включено), то обратная трассировка разрешена. В состоянии Off (Выключено) обратная трассировка запрещена. Прерывание выполнения программы Поскольку прикладные программы Windows являются интерактивными программами, лучшим способом отладки такой программы является запуск прикладной программы и последующее ее прерывание, либо достижение в ней точки останова. Выполнение по шагам или трассировка прикладной программы Windows не может быть основным методом отладки, поскольку в итоге вы достигнете той части кода, которая содержит бесконечный цикл или ожидает сообщения в окне. Вместо этого следует установить в про грамме точки останова, выполнить ее до такой точки, а затем, если нужно, трассировать ее по шагам. Если вы попадаете в цикл сообщения, то чтобы увидеть экран прикладной программы можно нажать Alt-F5, но вы не сможете взаимодействовать с программой. Вместо этого вы можете нажать для запуска программы клавишу F9. При этом вы сможете использовать окна пр икладной программы, но что если вам нужно вернуться в TDW, чтобы отследить ошибку, которая проявилась при использовании одного из окон? Можно прервать программу с помощью клавиш Alt-SysRq. После возврата в TDW вы можете установить в коде или при работе с сообщениями точки останова, задать элементы просмотра, просмотреть сообщения, которые могли быть зарегистрированы, или выполнить другие действия, необходимые для выявления ошибки. Когда вы будете готовы снова вернуться в основную программу, нажмите клавишу F9. Клавиши Ctrl-Alt-SysRq почти всегда будут прерывать выполнение вашей программы и возвращать управление отладчику. Они подействуют сразу при их нажатии, поэтому иногда вы можете оказаться в неожиданной части кода. Этот код может быть кодом Windows, которы й выполняет ваша программа и который появляется в окне CPU. Когда ваша программа прерывается, не должно происходить следующего: - Пошагового выполнения программы. Попытка пошагового выполнения программы после ее прерывания может привести к непредсказуемым результатам, поскольку ваша прикладная программа может выполнять в этот момент код Windows. Типичным результатом будет заверше ние работы Windows и TDW и вывод сообщения "Unrecoverable application error" ("Невосстановимая ошибка прикладной программы"). - Если ваша прикладная программа выполняла код Windows, не прирывайте выполнение прикладной программы или TDW. Если вы это сделает, это может привести к "путанице" в выполнении Windows и "зависанию", после чего придется перезапускать компьютер. Если вы п ытаетесь в такой ситуации осуществить выход или перезагрузку, то TDW будет выводить в диалоговом окне следующую подсказку: Ctrl-Alt-SysReqinterrupt. System crash possible. Continue? (Прерывание по Ctrl-Alt-SysRq. Возможен сбой системы. Продолжить?) Завершение работы вашей программы Когда ваша программа завершает работу и возвращается обратно в Windows, отладчик TDW снова получает управление. Он выводит сообщение, показывающее код завершения вашей программы, который будет возвращаться в Windows. Когда ваша программа завершила работу , до ее перезагрузки с помощью команды RunіProgram Reset (ВыполнениеіСброс программы) вы не можете воспользоваться ни одной из команд меню Run (Выполнение). Когда ваша программа завершила работу, сегментные регистры и стек обычно имеют некорректные значения, поэтому не анализируйте и не модифицируйте значения переменных после завершения программы. Возобновление сеанса отладки В Турбо отладчике TDW имеется средство, позволяющее по возможности гладко возобновить сеанс отладки. При отладке программы легко забрести слишком далеко и проскочить ошибку. TDW позволяет возобновить отладку и приостановить выполнение не несколько команд раньше (до ошибки). Как? Турбо отладчик TDW позволяет вам перезагрузить программу с диска с теми же аргументами командной строки. Чтобы перезагрузить отлаживаемую программу, используйте команду RunіProgram Reset (ВыполнениеіСброс программы) или нажмите клавиши Ctrl-F2. Турбо отладчик TDW перезагружает программу с диска со всеми данными, которые вы могли добавить с момента последнег о сохранения на диске. Это наиболее надежный способ перезапуска программы. Возобновление путем выполнения с начала программы рискованно, так как многие программы ожидают инициализации данных с образа программы на диске. Заметим, что команда Program Reset (Сброс программы) оставляет точки останова и выражения просмотра в неприкосновенности. Загрузка новой программы для отладки Новую программу для отладки можно загрузить с помощью команды FileіLoad (ФайліЗагрузка). Й[ю]НННННННННННННННEnter program to loadННННННННННННН» є File name є є°*.exe°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° OK є є ±±±±±± є є Files Directories Cancel є є bildsp.exe pepper ±±±±±± є є donothih.exe td Help є є dototal.exe tdold ±±±±±± є є drwhappy.exe є є echo.exe є є hello.exe є є tittle.exe є є mytest.exe є є pwrs.exe є є reserve.exe є є small.exe є є tcdemo.exe є є є єG:\NETFILES\DEBUG\PROGRAM\*.EXE є єBILDSP.EXE Feb 19,1991 2:23pm 4592 bytes є ИННННННННННННННННННННННННННННННННННННННННННННННННННННј Рис. 5.6 Диалоговое окно Load Program (Загрузка программы Enter program name to load - введите имя программы для загрузки; File name - имя файла; Files - файлы; Directories - каталоги; OK - выбор; Cancel - отмена; Help - справка. Вы можете ввести имя конкретного файла (.EXE) в поле ввода File Name. Если в ответ на подсказку вы нажмете клавишу Enter, то выведется список всех файлов .EXE в текущем каталоге. Переместите подсветку на имя того файла, который вы хотите загрузить, и наж мите Enter. Если вы вводите имя файла, который требуется загрузить, то подсветка перемещается к имени файла, которое начинается с первой введенной вами буквы (букв). Когда подсветка позиционируется на нужный файл, нажмите клавишу Enter. Передать аргументы отлаживаемой программе можно, поместив их после имени программы: myprog a b c При этом загрузится программа MyProg с тремя аргументами командной строки (a, b и c). Изменение аргументов программы Если вы забыли указать для своей программы необходимые аргументы при ее загрузке, то для задания или изменения аргументов можно использовать команду RunіArguments (ВыполнениеіАргументы). Введите новые аргументы в том порядке, в котором они указываются по сле задания имени программы в командной строке. Когда вы введете новые аргументы, Турбо отладчик TDW запросит вас, хотите ли вы перезагрузить программу с диска. Обычно следует отвечать Yes (Да), так как в большинстве программ новые аргументы будут действовать только если вы загрузите программу сначала . |