АСДиП   ЯП   ЯиМП   высокоуровн. языки - 3GL   визуальные среды - 4GL   5GL   технологии программирования

Основы программирования

Отладка программ

  1. Замечание для разработчиков на Visual Basic
  2. Как нужно читать этот курс?
  3. Системные требования
  4. ПРОЧИТАЙТЕ ЭТО! Символьная машина DBGHELP.DLL
  5. Ошибки: откуда они появляются и как их устранять
  6. Начало отладки
  7. Отладка во время кодирования
  8. Как работают отладчики?
  9. Интенсивная отладка средствами отладчика Visual C++.
  10. Отладка средствами языка ассемблера х86 и
    окна Disassembly отладчика Visual C++
  11. Интенсивная отладка средствами отладчика Visual Basic
  12. Поиск сбойной строки по аварийному адресу
  13. Обработчики аварий
  14. Мультимашинная, мультипроцессная трассировка
  15. Многопоточные блокировки
  16. Автоматизированное тестирование
  17. Ограничение вызовов функции OutputDebugString
  18. Отладочная С-библиотека времени выполнения (DCRT)
  19. Чтение журналов программы Dr. Watson
  20. Web-ресурсы для Windows-разработчиков
  21. Форматы точек прерывания

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

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

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

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

Второй круг проблем связан с отсутствием специальной литературы, посвященной вопросам отладки. Хотя имеется много превосходных книг по определенным Windows-технологиям, ни одна из них не освещает с достаточной для пользы дела глубиной отладку в рамках этих технологий. Чтобы эффективно отлаживать программы в любой технологии, следует знать гораздо больше, чем написано в книге по определенной технологии. Одно дело знать, как писать программы для элементов управления ActiveX, включаемых в обозреватель Microsoft Internet Explorer, - и совсем другое дело владеть отладкой таких элементов. Чтобы отлаживать элементы управления ActiveX, необходимо досконально изучить ActiveX- и СОМ объекты, а также знать, как библиотеки динамической компоновки (DLL) отображаются в памяти, и как в рамках СОМ-модели реализованы поиск и создание элементов управления. В некоторых книгах реализация сложных возможностей, таких как соединения удаленных баз данных, выглядит довольно легко, но когда в команде "db.Connect ("Foo")" программы на Visual Basic происходит сбой (а это происходит всегда), то поиск и восстановление нарушенного звена в технологической цепочке ложится на плечи разработчика тяжким грузом. Кроме того, хотя некоторые книги по руководству проектами и обсуждают отладку, они имеют тенденцию сосредотачиваться на организационных  и административных проблемах, а не на проблемах разработчиков. Такие книги прекрасно описывают планирование отладки, но от них мало проку, когда необходимо реагировать на аварийный останов, возвращаемый функцией обратного вызова.

 СОМ - Component Object Model, модель компонентных объектов. -Пер.

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

Мне чрезвычайно повезло, что в течение последних пяти лет я мог сосредоточиться почти исключительно на отладке, чему немало способствовали две неоценимых возможности. Первая представилась в фирме NuMega Technologies (теперь это Compuware NuMega), где я одним из первых начал работать в качестве разработчика, участвуя в больших командах, создающих автоматические инструменты обнаружения ошибок (BoundsChecker), повышения производительности (TrueTime), покрытия кода (TrueCoverage) и отладчиков (SoftICE). Работа над продуктами, пользователи которых, обнаружив в них ошибку, сообщают свое мнение, не особенно стесняясь в выражениях, побуждает разработчика к созданию возможно более эффективных программных изделий.

В дополнение к работе программистом и менеджером в NuMega, автор имеет удовольствие вести колонку "Bugslayer" в журнале"Microsoft Systems Journal", что позволяет сосредоточиться на отладке, а постоянное взаимодействие с разработчиками, создающими все вообразимые типы приложений, помогает ближе познакомиться с проблемами, которые сегодня приходится решать поставщикам программных продуктов.

 

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

Исходя из технической перспективы, "идеальным читателем" является тот, кто имеет опыт (от одного до трех лет) в применении систем программирования Microsoft Visual C++ и/или Microsoft Visual Basic. Предполагается также, что читатель является членом реальной команды разработчиков, и отправил заказчикам, по крайней мере, один продукт.

Продвинутые разработчики тоже могут, вероятно, многое почерпнуть в этом пособии. Я очень рад, что у меня есть замечательные друзья, моя "команда рецензентов" - главных критиков этого курса, ознакомившихся с ней перед тем, как она была представлена в Microsoft Press. Они перечислены в разделе "Благодарности" и являются людьми, которые учили меня, как нужно выполнять разработку и отладку. Действительно, это - ^дни из лучших разработчиков в нашем бизнесе. Я был чрезвычайно рад услышать от них, что они многое узнали из чтения этого текста.

Замечание для разработчиков на Visual Basic

Читая этот курс, вы заметите, что основное внимание уделено отладчику Visual C++, языкам С, C++ и ассемблеру. Тому есть две причины. Во-первых, языки С и C++ предоставляют разработчикам больше возможностей (чем язык Visual Basic) попасть в аварийные ситуации. Во-вторых, потому что отладчик Visual Basic не может отлаживать свой "родной" (native) откомпилированный двоичный код, и необходимо знать отладчик Visual C++, чтобы отладить приложение Visual Basic. При поверхностном взгляде можно подумать, что этот кур не охватывает Visual Basic, но внимательное чтение убеждает в обратном. Дойдя до реальной разработки на Visual Basic, читатель обнаружит, что почти весь курс применима и для этого случая. Отладка есть отладка, независимо от среды, окружающей разработку.

Как нужно читать этот курс

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

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

Во второй части курса "Возможности отладки" (главы 4-7) объясняется, что такое отладчик, и описывается работа различных отладчиков. Кроме того, здесь довольно подробно рассмотрены отладчики Visual C++ и Visual Basic. Промышленные разработчики - от начинающих до самых опытных - используют лишь крошечную долю возможностей отладчиков Visual C++ и Visual Basic. Хотя это может показаться странным, но автор курса, целиком посвященной отладке, постарается держать читателя на максимальном удалении от отладчика. Главное, чему необходимо научиться - не то, как исправлять аварийные ситуации, а прежде всего то, как их следует избегать. Но рано или поздно любому разработчику приходится прибегнуть к помощи отладчика, поэтому следует также научиться с максимальной эффективностью использовать этот инструмент.

В третьей части курса "Инструменты и методики" (главы 8-15) предложены решения общих проблем отладки, с которыми сталкивается разработчик Windows-приложений. Охвачены темы от поиска исходного файла и номера строки с адресом сбоя и автоматической проверки пользовательских интерфейсов до идентификации места, в котором многопоточная программа заходит в тупик. Большинство глав в этой части включает утилиты и огромное количество исходного кода, который послужит читателю прекрасным учебным материалом.

Заключительная часть курса (приложения 1-4) содержит дополнительную информацию, которую вы найдете полезной в своих отладочных приключениях. В приложении 1 объясняется, как читать и интерпретировать журнал программы Dr. Watson. В приложении 2 приведены аннотированные списки ресурсов - книг, инструментов и Web-сайтов, которые помогли автору отточить навыки разработки и отладки. В приложении 3 описаны форматы точек прерывания. Приложение 4 содержит краткое описание прилагаемого компакт-диска.

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

Системные требования

Для того чтобы эффективно работать с этим курсом, вам потребуется:

 

ПРОЧИТАЙТЕ ЭТО!

Символьная машина DBGHELP.DLL

В некоторых утилитах я использую символьную машину DBGHELP.DLL из операционной системы Windows 2000. На самом деле применялась символьная машина IMAGEHLP.DLL, которая была перемещена в DBGHELP.DLL с целью извлечения ее из DLL ядра операционной системы. Чтобы строить исходные коды этого курса, нужно иметь оба файла - DBGHELP.LIB и DBGHELP.H. На сопровождающем компакт-диске находится самая последняя (на момент написания курса) версия Platform SDK.

Нужно установить Platform SDK не только потому, что туда включено много отличных отладочных утилит, но и потому, что там можно также найти и файлы DBGHELP.LIB и DBGHELP.H. Для получения самых последних версий этого SDK нужно перед его установкой выполнить двойной щелчок на компакт-дисках универсальной подписки или на Web-адресе msdn.microsoft.com/developer/sdk.

Для работы символьной машины на Windows NT 4 и Windows 98 следует скопировать DBGHELP.DLL и MSDBI.DLL из Windows 2000 или из каталога < Platform SDK>\Redist\DbgHlp и разместить их в тот же каталог, что и использующую их программу. Например, если вы хотите применять программу CrashFinder для просмотра исходного файла и номера строки, в которой произошел отказ, нужно поместить DBGHELP.DLL в тот же каталог, что и CRASHFINDER.EXE.

Для того чтобы символьная машина DBGHELP.DLL находила ваши символы, помещайте PDB-файлы в тот же каталог, где вы создаете свои двоичные

файлы, либо поместите их в тот же каталог, в котором они уже находятся. Можно также сообщить символьной машине, где находятся PDB-файлы, с помощью специальных переменных окружения. Более подробно об этом можно узнать из MSDN-документации по API-функции SymInitiaiize.

Будьте готовы потратить некоторое время на то, чтобы заставить символьную машину DBGHELP.DLL работать. Понять, что она не работает, можно из того, что вы не получаете информацию о функции, или информация об исходном файле и номерах строк отсутствует в файлах, скомпилированных с отладочными PDB-символами. Работающая символьная машина DBGHELP.DLL даст вам превосходную возможность опробовать приемы отладки, обсуждаемые в этого курса. Я храню самую последнюю и полную информацию о символьной машине DBGHELP.DLL в разделе FAQ моего Web-сайта по адресу www.jprobbins.com. Изучив этот раздел и проводя небольшие отладки, вы должны получить свои отладочные символы.

АСДиП   к технологиям программирования   к алгоритмизации   к высокоуровн. языкам - 3GL   к визуальным средам - 4GL

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

Bourabai Research Institution home page

Bourabai Research - Технологии XXI века Bourabai Research Institution