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

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

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


Рисунок 1. Пример системы отладки программного обеспечения для микроконтроллеров

До недавнего времени внутрисхемный эмулятор являлся отдельным устройством, подключаемым к разрабатываемой плате вместо микроконтроллера. В состав современных микроконтроллеров часто входит встроенный внутрисхемный эмулятор. При этом наиболее удобным интерфейсом для связи с компьютером является JTAG интерфейс, хотя некоторые фирмы-производители микросхем предлагают свой интерфейс.

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



Рисунок 2. Пример внешнего вида отладчика интегрированной системы отладки программного обеспечения

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

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

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

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

Эта документация перемещена в архив и не поддерживается.

WinPE: отладка приложений

Для отладки приложений, а также ядра в среде предустановки Windows вы можете применить отладчики Windows, например Ntsd.exe, Cdb.exe, Windbg.exe, и вспомогательные средства. Средства отладки включены в Windows 10 SDK . Чтобы открыть доступ к средствам отладки на компьютере, где запускается среда предустановки Windows, их нужно скопировать на локальный диск или предоставить общий доступ.

Возможно, что для удаленной отладки среды предустановки Windows потребуется отключить встроенный брандмауэр на компьютере:

wpeutil disablefirewall

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

Чтобы выполнить отладку в пользовательском режиме, проще всего запустить на компьютере, где выполняется среда предустановки Windows, внутрипроцессный сервер и подключиться к нему, используя отладчик на другом компьютере. Сервер процессов входит в набор средств отладки в Windows 10 SDK .

Запуск внутрипроцессного сервера в пользовательском режиме

    Скопируйте средство сервера процессов отладки Windows dbgsrv.exe из папки средств отладки Windows 10 SDK (например, C \Windows Kits\10.0\Debuggers\x64 файлов \Program (x86) на компьютер c Windows PE.

    В командной строке среды предустановки Windows отключите брандмауэр.

    wpeutil disablefirewall

    Запустите внутрипроцессный сервер отладки Windows, указав способ подключения к компьютеру, например TCP-порт:

    dbgsrv.exe –t tcp:port=1234

    Активация сервера процессов (отладчики Windows) .

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

    windbg -premote tcp:server=Server, port=1234

    Дополнительные сведения см. в разделе Активация интеллектуального клиента (отладчики Windows) .

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

Эту процедуру можно применить, если вы хотите обойти startnet.cmd или setup.exe и перейти для отладки непосредственно из командной строки. При этом полностью исключается инициализация, в том числе установка, и не выполняются команды, например Wpeinit.exe. Процедуру нужно выполнять в сети на подключенной операционной системе.

Включение отладки в пользовательском режиме до инициализации

    Удалите файл winpeshl.ini, если он есть. Если файла winpeshl.ini не существует, отладка в пользовательском режиме доступна по умолчанию.

    Во время загрузки удерживайте клавишу CTRL, пока не появится командная строка. На экране появляется командная строка.

    Приступайте к отладке.

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

Чтобы выполнить отладку в режиме ядра, ее следует включить до загрузки системы. В файле конфигурации загрузки есть параметр отладки в режиме ядра, который можно включить при помощи программы командной строки bcdedit.exe для изменения хранилища данных конфигурации загрузки. Отладка в режиме ядра выполняется только с помощью bcdedit.exe. Bcdedit.exe находится разделе Windows в каталоге \Windows\System32.

Параметры отладчика по умолчанию выглядят так:

Identifier {dbgsettings} debugtype Serial debugport 1 baudrate 115200

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

Сведения об изменении хранилища данных конфигурации загрузки по умолчанию (default.bcd) см. в разделе Как изменить хранилище данных конфигурации загрузки с помощью Bcdedit .

Включение отладки в режиме ядра

    Найдите хранилище данных конфигурации загрузки, которое находится в файле с именем bcd . Этот файл находится в загрузочном каталоге в корне носителя, на котором записан образ среды предустановки Windows.

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

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

Отладка включает в себя элементы тестирования и разработки. На некоторых проектах отладка может занимать до 50 % всего времени разработки. Для многих программистов отладка - это самая трудная часть программирования. При соответствующем подходе количество ошибок, требующих отладки, должно сократиться, и отладка должна стать самой легкой частью; при таком подходе все ошибки сводятся к небольшим недосмотрам или опечаткам.

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

Ошибки синтаксиса языка

Как правило, в абсолютном большинстве случаев ловятся на стадии компиляции программы, или же, если вы работаете с интерпретируемым языком типа Рег1 или РНР, то при первом интерпретировании программы. Но есть один существенный момент - когда выражение допустимо, но зависит от конкретного компилятора или интерпретатора. Например, в языке Си вполне допустимыми по синтаксису, но не по смыслу, являются выражения: э [ 1++] =±; ргл_г^:? ("%с! %с!" , ±++, л.++) ;. Результат этих строк не определен, так как неизвестно, в каком порядке будет инкрементироваться и вычисляться значение переменной /". Переменная не может более 1 раза присутствовать в выражении, если ее значение изменяется в ходе вычисления этого выражения.

Ошибки во время выполнения

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

Ошибки логики взаимосвязанных CGI-программ

Ошибки данного типа лежат во взаимосвязанных CGI-программах. Рассмотрим в качестве примера тестовую систему (см. сайт http://test.itsoft.ru). При сдаче теста в цикле работают два скрипта. Первый показывает вопрос, а второй проверяет правильность ответа. Если в тесте 10 вопросов, то эти CGI-скрипты вызываются парно в цикле 10 раз. Но что будет, если пользователь нажмет кнопку «Обновить» в броузере? Скрипт, который показывает вопрос, вызовется повторно. Что будет при разрыве модемного соединения? Отладка в таких системах значительно сложнее, так как вам придется наблюдать за выполнением ряда взаимосвязанных скриптов.

Ошибки многопользовательского доступа

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

Невоспроизводимые ошибки

Невоспроизводимые ошибки представляют собой наиболее сложный тип ошибок. Например, в високосном году 29 февраля ваша система вдруг начала давать сбои, которые сами собой исчезают в невисокосном году. Но бывают ошибки, которые мистическим образом появляются и исчезают. В той же тестовой системе была непонятная ошибка, которая проявлялась 1 раз на несколько сот случаев. Непонятным образом некоторые студенты после сдачи теста получали не результаты, а сбой системы. На исправление этой ошибки ушло два рабочих дня. Оказалось, что проблема в скрипте на JavaScript, который отправлял данные HTML-формы на сервер после истечения допустимого времени ответа на вопрос. Проблема в том, что если время подходило к концу и пользователь нажимал кнопку «Ответить», а в это же время уже начала работать функция JavaScript form.submit(), то отправка данных HTML-формы происходила дважды, т. е. скрипт проверки правильности ответа вызывался 2 раза. А это за собой тянуло ошибку во взаимосвязанных CGI-скриптах, и внешнее проявление сбоя системы мы наблюдали уже при подсчете результатов, а не непосредственно сразу после двойной отправки HTML-формы. Сам код JavaScript был написан верно, и с теоретической точки зрения даже если пользователь нажимает кнопку «Отправить» в последнюю секунду, HTML-форма должна была отправляться только 1 раз. Но на практике все оказалось совсем по-другому. На самом деле ничего мистического нет, или, как говорится, чудес на свете не бывает. Просто невозможно воспроизвести условия, в которых наблюдалась невоспроизводимая ошибка. Надо искать в программе случайности: одновременный доступ к одному ресурсу, генератор случайных чисел, неинициализированные переменные, некорректная работа с памятью или преобразование типов, которые могут проявлять себя не каждый раз.

Ошибки инструментария и других компонентов системы

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

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

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

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

Использование отладчика. Возможности современных отладчиков перечислены ниже:

  • точки останова на конкретных строчках кода;
  • остановка на /7-й итерации цикла;
  • остановка при изменении переменных;
  • остановка при присваивании конкретного значения;
  • прохождение кода строчка за строчкой;
  • откат по программе (далеко не все);
  • исследование всех данных в программе, включая типы, определенные пользователем;
  • присваивание новых значений переменным;
  • продолжение исполнения программы;
  • многоязыковая отладка (язык1, язык2, ассемблер...);
  • запоминание установок.

Контрольные вопросы

  • 1. Какие виды ошибок существуют?
  • 2. Что такое тест? Какими свойствами должен обладать тест?
  • 3. Каковы критерии выбора тестов?
  • 4. Дайте краткую характеристику каждому критерию выбора теста.
  • 5. Опишите последовательность разработки тестов.
  • 6. Что входит в понятие надежности ПО?
  • 7. Какие виды отказов существуют?
  • 8. Каковы количественные характеристики надежности программ?
  • 9. Что представляют собой методы оценки и измерения характеристик надежности ПО?
  • 10. Перечислите достоинства парного программирования.

Windows 7 мраморный век империи из Редмонда

«Я принял Рим кирпичным, а оставляю мраморным» сказал в последние годы жизни известнейший римский император Октавиан Август. Что ж, если бы в 2009 году Майкрософт прекратила свое существования, что-то похожее можно было бы сказать с уверенностью.

Вспомните Windows 3.11, если вам приходилось ей пользоваться. Напоминающая тетрис в современном понимании она все же была фурором своего времени.

Времена изменились. Сегодня к ОС применяются куда более высокие требования. Анонсированная 22 октября 2009 года Windows 7 оказалась неким «мраморным веком» компании Майкрософт. Хотя с момента запуска системы прошло уже более 6 лет и сменилось еще два поклонения ОС, почти 60% от общего числа пользователей Windows пользуются именно «семеркой».

Почему Windows 7?

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

Кроме того, Майкрософт потренировались, отшлифовали все косяки и теперь, вот встречайте Windows 7.

Отличительные черты Windows 7

Официальную Windows 7 отличает отличная стабильность. Если вы пользовались , наверное, помните, что стабильной тогда была только необходимость переустанавливать систему примерно раз в полгода для хорошей работы ПК. Windows 7 же у пользователей стояла 2-3 года, а при уходе за ПК — даже дольше.

Новый, приятный интерфейс стали еще одним важным отличием. После квадратных форм XP, 7-ка была действительно красивой. Режим Aero также придавал свою изюминку.

Настройка Windows 7

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

Стоит ли удалить Windows 7?

Если ли смысл сейчас менять то, что уже устоялось, оставлять «мрамор»? Или хороша пословица: «Лучше синица в руках, чем журавль в небе». Каждый примет свое решение. В этом разделе PCgu.ru можно найти статьи и видео о том, как установить Windows 7 и о восстановлении этой ОС.

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

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

  1. Синтаксическая ошибка . Неправильное употребление синтаксических конструкций, например употребление оператора цикла For без то или Next.
  2. Семантическая ошибка . Нарушение семантики той или иной конструкции, например передача функции параметров, не соответствующих ее аргументам.
  3. Логическая ошибка . Нарушение логики программы, приводящее к неверному результату. Это наиболее трудный для "отлова" тип ошибки, ибо подобного рода ошибки, как правило, кроются в алгоритмах и требуют тщательного анализа и всестороннего тестирования.

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

В каждой современной системе программирования существует специальное средство отладки программ - отладчик (debugger), который позволяет в режиме интерпретации установить контрольные точки, выполнить отдельные участки программы и посмотреть результаты работы операторов. Естественно, что редактор Visual Basic имеет подобное средство, с которым мы сейчас и познакомимся. В вышеописанной программе мы специально допустили ошибки, на примере которых и продемонстрируем работу отладчика VBA.

Замечание

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

Первый шаг отладки - это запуск компилятора: Debug > compile <имяПроекта>. Компилятор, просматривая код программы, найдет ошибку и выдаст сообщение: sub or Function not defined (Процедура или функция не определены), выделив место ошибки (creatitem) в теле процедуры.

Итак, допущена синтаксическая ошибка, мы сделали опечатку (вместо createitem ввели creatitem), и компилятор стал расценивать это как вызов процедуры пользователя, которая нигде не объявлена. Быстро исправим эту оплошность, добавив злополучную е в код:

Set tsk = Createltem(olTaskltem)

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

Замечание

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

Запуск программы в VBA осуществляется разными способами. Уже упоминалась возможность запуска программы посредством нажатия клавиши или с помощью команды Run Sub\UserForm меню Run. Однако при таком вызове запускается активная процедура, т. е. процедура, в которой находится курсор. Другим Способом является вызов диалогового окна Macros из меню Tools. В этом окне можно выбрать запускаемую процедуру, не делая ее активной.

Итак, мы запустили программу. Что же происходит? Сразу после запуска появляется диалоговое ОКНО об ошибке: Object variable or With block variable not set (объектная переменная или переменная блока with не определена) и четыре варианта продолжения работы с программой (рис. 22.6):

  1. Continue. Продолжить выполнение программы.
  2. End. Закончить выполнение программы.
  3. Debug. Прервать выполнение программы и перейти в режим отладки.
  4. Help. Вывести подробную справку об ошибке.

Замечание

Хотя в данном случае кнопка Continue не активна, она бывает очень полезна в ряде случаев. Например, при прерывании хода программы комбинацией клавиш + только для проверки контрольных значений в окне Immediate, когда нет необходимости переходить в режим отладки, если все значения удовлетворительны. Кнопка End используется для окончательного прерывания хода программы, как правило, когда ошибка сразу видна и не требует отладочных средств.

Рис. 22.6. Диалоговое окно Run-time error "91"

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

В нашем же случае произошла семантическая ошибка: неправильное присваивание переменной значения ссылки на объект. Для устранения этой ошибки необходимо добавить оператор присваивания set перед переменной tsk. Давайте еще раз запустим программу. На этот раз она успешно завершилась, дойдя до конца и выдав сообщение "Задача успешно поручена".

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

Как видите, все параметры верны, кроме загадочного срока окончания задачи, который истекает через 5 дней, в то время как в диалоговом окне продолжительность проекта была равна 5 месяцам!!!

Итак, наша программа фактически работает, собирает данные из разных источников, создает задачу и даже назначает ее, но неверно устанавливает срок ее окончания. Надо констатировать, что мы столкнулись с последним типом ошибки - логическим. Компилятор не может отследить подобного рода ошибки автоматически, но это может сделать программист, используя, конечно, всевозможные способы и средства отладки.

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

Рис. 22.7.

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

Чтобы создать точку останова, следует в отлаживаемой процедуре установить точку ввода в любом месте строки кода VBA, перед выполнением которой вы хотите остановить выполнение процедуры. Затем нужно выбрать команду > Debug > Toggle Breakpoint или просто нажать клавишу . При этом строка будет выделена коричневым цветом, а на левом поле окна кода появится жирная коричневая точка. Для снятия точки останова нужно еще раз повторить те же действия. Если напротив оператора стоит точка ос танова, это означает, что выполнение программы будет приостановлено перед выполнением этого оператора.

Замечание

Есть и более простой и, на наш взгляд, естественный способ установки точек останова: достаточно просто сделать щелчок мышью по серой полоске у левого края соответствующей строки кода. Снять эту точку можно повторным щелчком по жирной коричневой точке. Наконец, если вы хотите снять все ранее поставленные точки останова, вовсе необязательно снимать все эти точки поодиночке. Достаточно воспользоваться командой меню > Debug > Clear All Breakpoints.

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

  • Инициализация переменной tsk (чему равняется значение по умолчанию).
  • Вызов стандартной функции NOW (действительно ли возвращается текущее время).
  • Установка даты окончания задачи (правильно ли происходит суммирование).

После расстановки точек останова необходимо, как было сказано, указать, значения каких переменных мы хотели бы наблюдать. Естественно, что мы выбрали значения полей tsk.startoate и tsk.DueDate. Для наблюдения за несколькими свойствами или переменными существуют специальные окна Locals Window и Watch Window. Эти окна можно открыть с помощью соответствующих кнопок на панели Debug или команд меню View.

В окне локальных переменных можно наблюдать за значением всех локальных переменных выполняемой в данный момент процедуры, а окно контрольных значений предназначено для постоянного наблюдения за выбранными пользователем переменными или свойствами. Чтобы определить контрольное значение, достаточно выделить в окне модуля любую переменную, выражение или свойство и нажать кнопку Quick Watch на панели инструментов Debug. При этом появится диалоговое окно, в котором указано имя подпрограммы, само выражение, а также его текущее значение (рис. 22.8).

Нажав на расположенную в правой части диалогового окна кнопку Add, можно переместить это выражение в список наблюдаемых контрольных значений в окне Watch. При этом в момент останова отлаживаемой программы весь список наблюдаемых выражений и их значения будут сразу же видны в соответствующем подокне, располагающемся обычно в нижней части экрана. Добавим переменную tsk. star toate вышеописанным способом. Чтобы наблюдать значение переменной, необходимо выполнить следующее действие.

Рис. 22.8. Точки останова и диалоговое окно Quick Watch

Пример 22.8. Добавление переменной в окно Add Watch

{В окне Watch}

1R Add Watch... (рис. 22.9)

Expression:= tsk.StartDate

Procedure AssignTask

Итак, точки останова расставлены, окно Add Watch с наблюдаемыми переменными активно, следовательно, с замиранием сердца переходим к трассировке программы. Итак, нажимаем клавишу , как и предполагалось, перед инициализацией переменной происходит останов программы. Все правильно. Теперь давайте посмотрим, как изменились значения переменных В окне Add Watch: tsk.StartDate = 01:01:4501, tsk.StartDate = 01:01:4501, a duration = 5.

Рис. 22.9. Диалоговое окно Add Watch

Для единичного просмотра значения переменной можно просто подвести к ней указатель мыши, и вы увидите всплывающую подсказку. Например, duration = 5.

Для дальнейшего пошагового выполнения программы можно воспользоваться одним из трех способов:

  1. Step Into. При нажатии клавиши выполняется очередной оператор, после чего выполнение программы приостанавливается и программа становится доступна для корректировки.
  2. Step Over. Нажатие комбинации клавиш + осуществляет вызов вспомогательных процедур и функций за один шаг, что дает возможность не задерживаться на их выполнении.
  3. Step Out. Данная комбинация клавиш ++ позволяет выйти из выполняемой вспомогательной процедуры, не дожидаясь конца ее пошагового выполнения.

Итак, нам необходимо нажать клавишу и посмотреть, чему стало равно значение tsk.startDate. Как и следовало ожидать, переменной было присвоено значение 21.08.01. (текущая дата 21 августа 2001 года). Следовательно, функция Now работает корректно.

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

DueDate = DateAdd("m", duration, .StartDate)

Замечание

Встроенная функция DateAdd предназначена для добавления или вычитания из даты указанного числа временных интервалов.

В конце рассказа об отладчике мы решили на рис. 22.10 показать панель инструментов Отладка (Debug) с кнопками, используемыми при отладке, а в табл. 22.1 привести краткую справку по всем использованным и неиспользованным средствам отладчика.

Рис. 22.10. Кнопки панели Отладка

Команда Назначение
Compile Компиляция программы
Run Sub/UserForm Запуск процедуры или формы
Break Прерывание выполнения программы +
Reset Остановка выполнения программы
Toggle Breakpoints Установить точку останова
Clear All Breakpoints Снять все точки останова
Step Into Шаг с заходом во вспомогательные процедуры
Step Over Шаг с обходом вспомогательных процедур
Step Out Шаг с выходом из вспомогательной процедуры
Step to Cursor Шаг до курсора. Запускает программу на выполнение до строки с курсором
Set Next Statement Позволяет устанавливать следующий выполняемый оператор
Show Next Statement Показывает следующий выполняемый оператор
Immediate Window Отображает окно отладочных результатов вычисления
Locals Window Отображает окно локальных переменных процедуры
Watch Window Отображает окно контрольных выражений программы
Add Watch Добавляет выражение в окно Watch
Edit Watch Исправляет выражение в окне Watch
Quick Watch Просматривает значение выделенного выражения
Call Stack Позволяет показать стек вызовов процедур в текущий момент. Эта кнопка очень полезна при работе с рекурсивными процедурами
Comment Block Позволяет закомментировать выделенный блок операторов
Uncomment Block Отменяет сделанные комментарии
Toggle Bookmarks Устанавливает закладку
Clear All Bookmarks Снимает все установленные закладки
Find Вызывает диалоговое" окно поиска, посредством которого можно найти ту или иную переменную, выражение и т. д.

Таблица 22.1. Средства отладчика

К сожалению, не все приемы отладки можно рассмотреть на нашем простейшем примере.