Programming stuff
Страницы
понедельник, 23 февраля 2009 г.
Книга Джона Роббинса «Отладка приложений для Microsoft .NET»
Не зависимо от используемого языка программирования и операционной системы, среды разработки и методологии, вашего опыта и профессионализма вашей команды, вы рано или поздно столкнетесь с одной из самых неприятных сторон нашей работы – с ошибками.
Ошибки неизбежное зло, которое рано или поздно настигнет вас и будет преследовать до тех пор, пока вы с ними не справитесь (или пока они не справятся с вами, что закончится вашим переводом на другой проект или в другой коллектив). Ошибки могут быть самыми различными, начиная от несогласованного пользовательского интерфейса, и низкой производительности, заканчивая аварийным завершением работы программы с последующим форматированием жесткого диска.
«Ошибки – это круто! Они помогают залезть в самую глубину и понять, как работают вещи. Мы все попали в этот бизнес, потому что нам нравится учиться, выслеживание ошибок – неотъемлемая часть обучения… Ведь так здорово бывает найти и исправить ошибку! Конечно же, самые хорошие ошибки – это те, которые обнаруживаются до того, как заказчик увидит ваш продукт. Таким образом, вы должны успевать сделать свою работу и найти ошибки до того, как это сделают ваши заказчики. Видеть, как заказчики обнаруживают ошибки, — это совершенно не круто».
Поскольку процесс поиска и исправления ошибок является такой же неотъемлемой частью разработки программного обеспечения, как и анализ требований, проектирование, кодирование и тестирование, польза этой книги очевидна. Очень интересной является первая глава книги, в которой автор рассказывает о типах ошибок и причинах их возникновения. Ведь с многими причинами, такими как нереальные сроки выполнения проекта или подход «сначала кодируем, потом думаем», сталкиваются большинство из нас. И хотя сам факт правоты автора никак не повлияет на судьбу простого разработчика, вполне вероятно, что уже сейчас вы способны решать вопросы, влияющие на качество вашего продукта, и тогда советы автора окажутся просто бесценными.
Во второй главе, «Подготовка к отладке», автор описывает основополагающие вещи, без которой не то что отладка, а сам процесс разработки практически невозможен. Здесь речь идет о системах управления версиями и отслеживания ошибок, о важности модульных и дымовых (smoke) тестов, о важности отладочных символов и хранилища символов, о предупреждениях компилятора и средствах анализа кода. Все это (или многое) уже давно известно многим из нас. Но это позволит критическим взглядом окинуть ваш процесс разработки и сделать соответствующие выводы.
Третья глава посвящена «упреждающему программированию» или «отладке во время кодирования», а именно утверждениям, трассировке и комментированию кода. Наиболее интересным является обзор и реализация инструмента SUPERASSERT.NET, который способен в значительной степени облегчить процесс последующего поиска ошибок.
Далее, автор касается чрезвычайно широкого спектра вопросов. Это и отладка запуска служб, и решение проблем, связанных с многопоточностью и отладкой взаимоблокировок, и реализация обработки исключений, и решение проблем с загрузкой сборок. Также описаны расширенные возможности отладки с использованием Visual Studio, утилиты WinDBG, SOS, FxCop и даже написание собственных правил Code Analysis.
Автор дает ответы на многие вопросы, связанные с разработкой и отладкой программного обеспечения. Но что еще больше впечатляет, так это перечень тем, которые автор поднимает на страницах своей книги. Книга не отличается глубиной изложения, в ней не рассматривается во всех подробностях IL, работа компилятора или внутренности среды CLR. Самым полезным является расширение вашего кругозора, возможность проанализировать собственный опыт и более подробно изучить хромающую область.
Омрачает эту светлую картину только одна проблема – перевод. В книге хватает как откровенных ляпов, так и просто некорректно переведенных терминов или фраз. В книге встречаются переходные разработчики (intermediate developer), собственные приложения (native applications), вползание функций (feature creep), язык посредника (intermediate language) и многое другое. Нельзя сказать, что подобных проблем слишком много или что они сильно сказываются на восприятии материала, но все же издательству следует подходить к таким вопросам более серьезно.
Несмотря на это книга, безусловно, стоит затраченных средств и усилий и будет полезна большинству разработчиков. И самое главное, «помните, что отладчик – это всего лишь инструмент, как, например, отвертка. Он делает только то, что вы приказываете ему делать. Настоящий отладчик находится у вас в голове».
Отладка приложений Microsoft .NET и Microsoft Windows
Автор: Джон Роббинс
Издательство: Русская Редакция, 2004
736 страниц
Материал предоставил: Алексей Кирюшкин
Аннотация
Содержание
Введение
Ошибки — жуткая гадость. Многоточие. Ошибки являются причиной обреченных на гибель проектов с сорванными сроками, ночными бдениями и опостылевшими коллегами. Ошибки могут превратить вашу жизнь в кошмар, поскольку, если изрядное их число затаится в вашем продукте, пользователи могут прекратить его применение, и вы потеряете работу. Ошибки — серьезный бизнес.
Много раз люди из нашей среды называли ошибки всего лишь досадным недоразумением. Это утверждение далеко от истины, как никакое другое. Любой разработчик расскажет вам о проектах с немыслимым количеством ошибок и даже о компаниях, загнувшихся оттого, что их продукт содержал столько ошибок, что был непригоден. Когда я писал первое издание этой книги, NASA потеряла космический зонд, направленный на Марс, из-за ошибок, допущенных при выработке требований и проектировании ПО. Во время написания данного издания на солдат американского спецназа упала бомба, направленная на другую цель. Причиной была программная ошибка, возникшая при смене источника питания в системе наведения. По мере того как компьютеры управляют все более ответственными системами, медицинскими устройствами и сверхдорогой аппаратурой, программные ошибки вызывают все меньше улыбок и не рассматриваются как нечто самой собой разумеющееся.
Я надеюсь, что эта книга прежде всего поможет вам узнать, как писать программы с минимальным числом ошибок и отлаживать их побыстрее. При правильном подходе вы сэкономите на отладке массу времени. Речь не идет о выработке требований и проектировании, но отлаживать вы наверняка научитесь более грамотно. В этой книге описывается интегральный подход к отладке. Я рассматриваю отладку не как отдельный шаг, а как составную часть общего цикла производства ПО. Я считаю, что ее следует начинать на этапе выработки требований и продолжать вплоть до стадии производства.
Две вещи делают отладку в средах Microsoft .NET и Microsoft Windows сложной и отнимающей много времени. Во-первых, отладка требует опыта — в основном вам потребуется все постигать самим. Даже если у вас специальное образование, бьюсь об заклад, что вы никогда не сталкивались со специальным курсом, посвященным отладке. В отличие от таких эзотерических предметов, как методы автоматической верификации программ на языках программирования, которые ни один дурак не использует, или разработка отладчиков для дико прогрессивных и жутко распараллеленных компьютеров, наука отладки, применяемая в коммерческом ПО, похоже, совсем не популярна в вузовском истэблишменте. Некоторые профессора наставляют: главное — не писать программы с ошибками. Хоть это и выдающаяся мысль и идеал, к которому все мы стремимся, в действительности все слегка по-другому. Изучение систематизированных проверенных методик отладки не спасет от очередной ошибки, но следование рекомендациям этой книги поможет вам сократить число ошибок, вносимых в код, а те из них, которые все-таки туда прокрались, найти быстрее.
Вторая проблема в том, что, несмотря на обилие прекрасных книг по отдельным технологиям .NET и Windows, ни в одной из них отладка не описана подробно. Для отладки в рамках любой технологии нужно знать гораздо больше, чем отдельные аспекты технологии, описываемой в той или другой книге. Одно дело знать, как встроить элемент управления ASP.NET на страницу, совсем другое — как полностью отладить элемент управления ASP.NET. Для его отладки нужно знать все тонкости .NET и ASP.NET, знать, как различные DLL помещаются в кэш ASP.NET и как ASP.NET находит элементы управления. Многие книги объясняют реализацию таких сложных функций, как соединение с удаленной базой данных с применением современнейших технологий, но когда в вашей программе не работает «db.Connect («Foo»)» — а рано или поздно это обязательно случается! — приходится самому разбираться во всей технологической цепочке. Кроме того, хотя есть несколько книг по управлению проектами, в которых обсуждаются вопросы отладки, в них делается упор на управленческие и административные проблемы, а не на задачи разработчиков. Эти книги могут включать прекрасную информацию о планировании отладки, но от этого мало толку, когда вы сталкиваетесь с разрушением базы данных или сбоем при возврате из функции обратного вызова.
Идея этой книги — плод моих проб и ошибок как разработчика и менеджера, старающегося вовремя поставить высококачественный продукт, и как консультанта, пытающегося помочь другим завершить свои разработки в срок. Год за годом я накапливал знания и подходы, применяемые для решения двух описанных проблем, чтобы облегчить разработку Windows-приложений. Для решения первой проблемы (отсутствия формального обучения по вопросам отладки) я написал первую часть этой книги — четкий курс отладки с уклоном в коммерческую разработку. Что касается второй проблемы (потребности в книге по отладке именно в .NET, а также в традиционной Windows-среде), я считаю, что написал книгу, заполняющую пробел между специфическими технологиями и будничными, но жизненно необходимыми практическими методами отладки.
Я считаю, мне просто повезло заниматься почти исключительно вопросами отладки последние восемь лет. Сориентировать свою карьеру на отладку мне помогли несколько событий. Первое: я был одним из первых инженеров, работавших в компании NuMega Technologies (ныне часть Compuware) над такими крутыми проектами, как BoundsChecker, TrueTime, TrueCoverage и SoftlCE. Тогда же я начал вести рубрику «Bugslayer» в «MSDN Magazine», а затем взялся и за первое издание этой книги. Благодаря фантастической переписке по электронной почте и общению с инженерами, разрабатывающими все мыслимые типы приложений, я получил огромный опыт.
И, наконец, самое важное, что сформировало мое мировоззрение, — участие в создании и работе Wintellect, что позволило мне пойти далеко вперед и помогать в решении весьма серьезных проблем компаниям по всему миру. Представьте, что вы сидите на работе, на часах — полдень, в голове — никаких идей, а клиент может обанкротиться, если вы не найдете ошибку. Сценарий устрашающий, но адреналина хоть отбавляй. Работа с лучшими инженерами в таких компаниях, как Microsoft, eBay, Intuit и многими другими — лучший из известных мне способов узнать все методы и хитрости для устранения ошибок.
ДЛЯ КОГО ЭТА КНИГА?
Я написал эту книгу для разработчиков, которые не хотят допоздна сидеть на работе, отлаживая программы, и хотят улучшить качество своего кода и организации. Я также написал эту книгу для менеджеров и руководителей коллективов, которые хотели бы иметь более эффективные команды разработчиков.
С технической точки зрения, «идеальный читатель» — это некто, имеющий опыт разработки для .NET или Windows от одного до трех лет. Я также рассчитываю, что читатель является членом реальной команды и уже поставил хотя бы один продукт. Хоть я и не сторонник навешивать ярлыки, в программной отрасли разработчики с таким уровнем опыта называются «средними».
Для опытных разработчиков тоже будет польза. Многие из наиболее заинтересованных корреспондентов в переписке по первому изданию этой книги были опытные разработчики, которым, казалось бы, и учиться уже нечему. Я был заинтригован тем, что эта книга помогла им добавить новые инструменты в свой арсенал. Так же, как и в первом издании, группа замечательных друзей под названием «Команда Рецензентов» просматривала и критиковала все главы, прежде чем я отправлял их в Microsoft Press. Эти инженеры, перечисленные в разделе «Благодарности» этой книги, — сливки общества разработчиков, благодаря им каждый читатель этой книги узнает что-нибудь полезное.
КАК ЧИТАТЬ ЭТУ КНИГУ И ЧТО НОВОГО ВО ВТОРОМ ИЗДАНИИ
Первое издание было ориентировано на отладку, связанную с Microsoft Visual Studio 6 и Microsoft Win32. Поскольку появилась совершенно новая среда разработки, Microsoft Visual Studio .NET 2003, и совершенно новая парадигма программирования, .NET, есть еще о чем рассказать. На самом деле в первом издании было 512 страниц, а в этой — около 850, так что новой информации хватает. Несколько моих рецензентов сказали: «Непонятно, почему ты называешь это вторым изданием, это же совершенно новая книга!» Чтобы вы правильно понимали, насколько второе издание больше первого, замечу, что в первом издании 2,5 Мб исходных текстов, а в этом — 6,9! Не забывайте: это только исходные тексты и вспомогательные файлы, а не скомпилированные двоичные файлы (скомпилировав все, вы получите более 1 Гб). Что еще интересней, я даже не включил две главы из первого издания во второе. Как видите, это совершенно новая книга.
Я разделил книгу на четыре части. Первые две (главы с 1 по 8) следует читать по порядку, поскольку материал в них изложен в логической последовательности.
В части I «Сущность отладки» (главы с 1 по 3) я даю определение видов ошибок и описываю процесс отладки, которому следуют все порядочные разработчики. По просьбе читателей первого издания я расширил и углубил обсуждение этих тем. Я также рассматриваю инфраструктурные требования, необходимые для правильной коллективной отладки. Настоятельно рекомендую уделить особое внимание вопросу установки сервера символов в главе 2. Наконец, поскольку вы можете (и должны) уделять огромное внимание отладке на этапе кодирования, я рассказываю про упреждающую отладку при написании кода. Заключительное слово в обсуждении темы первой части — в главе 3, в которой говорится об утверждениях в .NET и Win32.
Часть II «Производительная отладка» (главы с 4 по 8) я начинаю объяснением поддержки отладки со стороны ОС и рассказываю о работе отладчика Win32, так как Win32-oтлaдкa имеет больше потаенных мест, чем .NET Чем лучше вы разберетесь с инструментарием, тем лучше сможете его применять. Я также достаточно глубоко разбираю отладчик Visual Studio .NET, так что вы научитесь выжимать из него по максимуму как в .NET, так и в Win32. Одна вещь, которую я узнал, работая с программистами как опытными, так и очень опытными, — они используют лишь крошечную часть возможностей отладчика Visual Studio .NET Хотя такие сантименты могут казаться странными в устах автора книги об отладке, я хочу, насколько это возможно, оградить вас от применения отладчика. Читая книгу, вы увидите, что моя цель в первую очередь — научить вас избегать ошибок, а не находить их. Я также хочу научить вас использовать максимум возможностей отладчика, поскольку все-таки настанут времена, когда вы будете его применять.
В части III «Мощные средства и методы отладки приложений .NET» (главы с 9 по 11) я предлагаю несколько утилит для .NET-разработки. В главе 9 описаны потрясающие возможности расширения Visual Studio .NET Я представляю несколько отличных макросов и надстроек, которые помогут ускорить разработку независимо от того, с чем вы работаете: с .NET или только с Win32. В главах 10 и 11 рассказывается об отличном интерфейсе .NET Profiling API и представляются два инструмента, которые помогут вам отслеживать исключения и ход выполнения ваших .NET-приложений.
В заключительной части «Мощные средства и методы отладки неуправляемого кода» (главы с 12 по 19) предлагаются решения распространенных проблем отладки, с которыми вы столкнетесь при написании Windows-приложений. Я раскрываю темы от поиска исходного файла и номера строки для сбойного адреса, до корректной обработки сбоев приложений. Главы с 15 по 18 были и в первом издании, однако я существенно изменил их текст, а некоторые утилиты (Deadlock-Detection, Tester и MemDumperValidator) полностью переписал. Кроме того, такие утилиты, как Tester, прекрасно работают как с неуправляемым кодом, так и с .NET И, наконец, я добавил два новых отладочных инструмента для Windows: FastTrace (глава 18) и Smooth Working Set (глава 19).
Приложения (А и Б) содержат дополнительную информацию, которую вы найдете полезной в своих отладочных приключениях. В приложении А я объясняю, как читать и интерпретировать журнал программы Dr. Watson. В приложении Б вы обнаружите аннотированный список ресурсов (книг, инструментов, Web-сайтов), которые помогли мне отточить свое мастерство как разработчика/отладчика.
В первом издании я предложил несколько врезок с фронтовыми очерками об отладке. Реакция была ошеломляющей, и в этом издании я существенно увеличил их число. Надеюсь, поделившись с вами примерами некоторых действительно «хороших» ошибок, я помог обнаружить (или внести!) аналогичные, и вы увидели практическое применение рекомендуемых мной подходов и методик. Мне также хотелось бы помочь вам избежать ошибок, сделанных мной.
У меня был список вопросов, которые мне задали в связи с первым изданием, и на них я ответил во врезках «Стандартный вопрос отладки».
Комментарии
Второе издание отличной книги. Причем расширенное и исправленное по отзывам читателей в части отладки неуправляемого кода и дополненное сведениями об отладке приложений .NET. Расширена книга значительно — 736 страниц против 490 в первом издании.
Особо хочется отметить сугубо практический подход автора к излагаемому материалу — если речь идет о пользе отладочных символов ОС, то тут же следует подробная инструкция по достижению символьной нирваны — созданию собственного сервера отладочных символов для вашей команды, рассматривается применение ASSERT-ов — автор проводит читателя по этапам реализации SUPERASSERT-а, выводящего в окне сообщения максимум информации, включая стек вызовов:
Даже рассмотрение вопросов блокировок в многопоточных приложениях заканчивается созданием утилиты DeadlockDetection для обнаружения мест блокировок и вывода максимальной информации для разработчика.
Максимум всесторонней информации по отладке приложений и отличная коллекция отладочных библиотек и утилит, разработанных автором (вместе с их исходными кодами!) делают книгу незаменимой для любого разработчика приложений под Windows.