Отладка службы

октября 12 2009 by admin in Службы

По некоторым причинам отладка службы — дело более тонкое, чем отладка обычного приложения. Прежде всего, служба не может быть запущена отладчиком — она должна запускаться SCM. Кроме того, многие службы запускаются до того, как пользователь зарегистрируется на машине. Поэтому правильно будет установить ручной, а не автоматический запуск отлаживаемой службы. И, наконец, службы работают с собственными оконными станциями и рабочими столами, невидимыми для пользователя, работающего в диалоговом режиме.
Так можно ли отлаживать службу? Лучше всего это делать, запуская ее не как службу, л как обычный исполняемый модуль. Если в функции (w)main или (w)WinM(iiv. своей службы вы предусмотрели возможность переключения на разные ветви программы в зависимости от вводимых в командной строке параметром, вы можете вызвать функцию ServiccMain службы напрямую, а не через обращение к SlanSerriceCttiDispatcber. У этой методики есть, конечно, недостатки.
Если исполняемый модуль содержит несколько служб, отлаживать в каждый отдельный момент вы сможете только одну.
Исполняемый модуль обращается к вашей учетной записи (т. е. к учетной записи пользователя, работающего в диалоговом режиме), а не к учетной записи, с которой бы работал SCM. Так что вы можете не получить доступ к ресурсам, к которым в нормальной ситуации у вас был бы доступ.
Вы не сможете посылать службе уведомления о приостановке, продолжении, останове, выключении или уведомления пользовательских типов, что лишит вас возможности проверки отдельных ветвей алгоритма.
Такой подход очень прост, но лучше подключать отладчик к службе в процессе ее работы. Многие отладчики позволяют подключаться к работающему процессу. Если отладчик в вашей системе уже установлен, вы можете открыть диспетчер задач, щелкнуть правой кнопкой имя процесса вашей службы и выбрать в контекстного меню команду Debug. Запустится отладчик, и он присоединится к вашей службе. Теперь вы можете устанавливать контрольные точки, отлаживать код своей службы и даже проверять реакцию службы на уведомления. Проблемы с подключением отладчика к службе следующие.
Учетная запись, с которой вы регистрировались в системе, должна иметь привилегию, необходимую для отладки. По умолчанию ею обладают только администраторы. Если вы регистрируетесь как Power User или с другой учетной записью, администратор должен предоставить вам привилегию отладки.
У вас не будет возможности отладки начального инициализационного кода, так как отладчик будет подключен после запуска службы в процессе ее работы.
Использовать этот подход для отладки инициализационного кода вашей службы довольно легко, добавив обращение к функции DebugBreak внутри вашей функции (и:) та in или (iv)WinMain. Однако эта методика годится только для служб, работающих с учетной записью LocalSystem. При использовании другой учетной записи отладчик не будет правильно работать, так как система не позволит ему взаимодействовать с диалоговой оконной станцией и рабочим столом.