Трассировка
Утверждения, возможно, наилучший прием профилактического программирования, но операторы трассировки, если их правильно использовать совместно с утверждениями, на самом деле позволяют отлаживать приложения без отладчика. Подобно утверждениям, макросы TRACE (для С и С ++) и Debug.Print (для Visual Basic) применяются и в выпускных компиляциях, причем их можно использовать в исходном тексте столько раз, сколько нужно. Некоторые программисты воспринимают операторы трассировки как средства отладки priritf-стиля. Не стоит недооценивать мощь этой методики, потому что большинство приложений было отлажено прежде, чем были изобретены диалоговые отладчики.
Определение возможного объема трассировки всегда было проблемой, особенно если речь идет о работе в команде. Хотя каждый разработчик трассирует понемногу, общий объем таких операторов может быстро стать огромным. Операторы трассировки, как минимум, должны ассоциироваться со всеми ключевыми структурами данных и ветвями программы. Они настолько полезны, что можно размещать в приложениях любое количество подобных операторов. В главе 14 описана программа LIMODS, позволяющая ограничить применение операторов трассировки только теми исходными файлами, за которыми интересно наблюдать.
Операторы трассировки могут разрешить почти все проблемы, но имеют два недостатка.
Первый состоит в том, что при вызове операторы трассировки обычно преобразуют выполнение приложения в последовательную форму. Это означает, что, когда вы используете такие операторы, быстродействующее многопоточное приложение может выполняться совершенно иным способом, потому что потоки блокируются и планируются вокруг операторов трассировки. Если вы правильно разрабатывали многопоточный код (например так, как описывается в главе 12), то никаких проблем возникать не должно. Однако известны случаи, когда код, который работает внутри отладчика или с большим количеством операторов трассировки, не выполняется вне отладчика или в выпускном режиме.
Второе ограничение состоит в том, что из-за проблемы сериализации (преобразования в последовательную форму) излишне большое количество операторов трассировки очень сильно замедлить выполнение вашей отладочной конструкции.
Если имеет место такая ситуация, значит вы слишком увлекаетесь трассировкой, и необходимо ограничить количество соответствующих операций. Поэтому старайтесь не помещать операторы трассировки внутри затяжных циклов.
Планируя стратегию трассировки, вся команда тратит некоторое время на обдумывание методики форматирования соответствующих операторов. Если все члены команды используют аналогичный формат, то поиск информации с помощью §гер1-утилит или написания простых синтаксических анализаторов для регистрационных журналов — довольно простая задача. Я предпочитаю использовать формат "функция: оператор трассировки". Начиная формат с имени функции, можно легко отыскивать только те функции, которые нужно видеть. Будьте осторожны, чтобы не слишком усложнять этот формат. Если он будет слишком сложным, то разработчики не смогут его запомнить и поэтому не будут использовать.
Обычно операторы трассировки видны только в окне Output отладчика. Однако свободно распространяемая на www.sysinternals.com утилита DebugView/Enterprise Edition Марка Руссиновича (Mark Russinovich) позволяет видеть операторы трассировки даже тогда, когда приложение выполняется вне отладчика. Я всегда запускаю эту программу. Просматривая операторы трассировки, можно видеть, что происходит в приложениях. Утилита DebugView/Enterprise Edition особенно полезна при работе с мультипроцессными СОМ-приложениями, потому что можно видеть все межпроцессные взаимодействия в одном месте. Другая область, в которой эта утилита оказывает неоценимую помощь, — это СОМ-приложения, выполняющиеся в контекстах, которыми разработчик не может управлять — такие, например, как Microsoft Internet Information Services (US).
Речь идет о программах поиска строк в текстовых файлах. Название происходит от соответствующей команды UNIX (grep). В UNIX используется также поисковая команда find, которая ищет файлы в каталогах. — Пер.