Код отладки / регистрации действительно может быть навязчивым. В наших проектах C ++ мы заключаем общий код отладки / журнала в макросы - очень похоже на утверждения. Я часто нахожу, что ведение журнала наиболее полезно в компонентах нижнего уровня, поэтому оно не должно идти везде.
В других ответах есть много вопросов, с которыми можно согласиться и не согласиться :) Наличие кода отладки / регистрации может быть очень полезным инструментом для устранения неполадок. В Windows есть много методов - две основные из них:
- Широкое использование проверенных (DBG) сборок подтверждает и много тестов на сборках DBG.
- использование ETW в том, что мы называем 'fre' или 'retail' сборками.
Проверенные сборки (которые чаще всего называют сборками DEBUG) также очень полезны для нас. Мы запускаем все наши тесты как на сборках 'fre', так и на сборке 'chk' (также на x86 и AMD64, все более серьезные вещи работают и на Itanium ...). Некоторые люди даже самостоятельно принимают (собачий корм) на проверенных сборках. Это делает две вещи
- Находит много ошибок, которые иначе не найдутся.
- Быстро устраняет шумные или неестественные утверждения.
В Windows мы широко используем Event Tracing для Windows (ETW). ETW - эффективный механизм статического каротажа. Ядро NT и многие компоненты очень хорошо оснащены. ETW имеет много преимуществ:
- Любой поставщик событий ETW может быть динамически включен / отключен во время выполнения - перезагрузка или перезапуск процесса не требуются. Большинство провайдеров ETW обеспечивают детальный контроль над отдельными событиями или группами событий.
- События от любого провайдера (наиболее важно, ядра) могут быть объединены в одну трассировку, поэтому все события могут быть коррелированы.
- Объединенную трассировку можно скопировать из коробки и полностью обработать - с помощью символов.
- Образец прерывания файла образца ядра NT может генерировать событие ETW - это дает очень легкий образец профилировщика, который можно использовать в любое время
- В Vista и Windows Server 2008 регистрация событий не блокируется и полностью поддерживает несколько ядер - поток на каждом процессоре может независимо регистрировать события без необходимости синхронизации между ними.
Это очень ценно для нас и может быть полезно для вашего кода Windows - ETW может использоваться любым компонентом, включая пользовательский режим, драйверы и другие компоненты ядра.
Одна вещь, которую мы часто делаем, это пишем потокового потребителя ETW. Вместо того, чтобы помещать printfs в код, я просто помещаю события ETW в интересные места. Когда мой компонент работает, я могу в любое время просто запустить свой наблюдатель ETW - наблюдатель получает события и отображает их, устанавливает их или выполняет с ними другие интересные действия.
Я очень уважительно не согласен с tvanfosson. Даже лучший код может извлечь выгоду из хорошо реализованной регистрации. Хорошо реализованная статическая регистрация во время выполнения может упростить поиск многих проблем - без этого вы не будете иметь никакого отношения к тому, что происходит в вашем компоненте. Вы можете посмотреть на входы, выходы и догадаться - вот и все.
Здесь ключом является термин «хорошо реализованный». Контрольно-измерительные приборы должны быть в нужном месте. Как и любая другая вещь, это требует некоторых мыслей и планирования. Если его нет в полезных / интересных местах, он не поможет вам найти проблемы в сценарии разработки, тестирования или развертывания. Вы также можете иметь слишком много инструментария, вызывающего проблемы с перфорацией, когда он включен - или даже выключен!
Конечно, разные программные продукты или компоненты будут иметь разные потребности. Некоторые вещи могут нуждаться в очень небольшом количестве инструментов. Но широко деполированный или критический компонент может значительно выиграть от инженерного инструментария.
Вот сценарий для вас (обратите внимание, это очень хорошо может не относиться к вам ... :)). Допустим, у вас есть бизнес-приложение, развернутое на каждом настольном компьютере в вашей компании - сотни или тысячи пользователей. Что вы делаете, когда у кого-то есть pbolem? Вы заходите в их офис и подключаете отладчик? Если да, то как узнать, какая у них версия? Где вы получаете правильные символы? Как вы получаете отладчик в своей системе? Что делать, если это происходит только раз в несколько часов или дней? Собираетесь ли вы позволить системе работать с подключенным отладчиком все это время?
Как вы можете себе представить - подключение отладчика в этом сценарии разрушительно.
Если ваш компонент оснащен ETW, вы можете попросить своего пользователя просто включить трассировку; продолжать делать свою работу; затем нажмите кнопку «WTF», когда возникнет проблема. Еще лучше: ваше приложение может иметь возможность самостоятельной регистрации - обнаружение проблем во время выполнения и автоматическое включение регистрации. Он может даже отправлять вам файлы ETW при возникновении проблем.
Это всего лишь простые примеры - ведение журнала можно обрабатывать разными способами. Здесь я рекомендую подумать о том, как протоколирование может помочь вам найти, отладить и исправить проблемы в ваших компонентах во время разработки, тестирования и после их развертывания.