Существует ли более простой способ пошагового выполнения кода, чем запуск службы через диспетчер управления службами Windows и последующее присоединение отладчика к потоку? Это довольно громоздко, и мне интересно, есть ли более простой подход.
c#
debugging
windows-services
Matthias
источник
источник
Ответы:
Если я хочу быстро отладить сервис, я просто падаю в
Debugger.Break()
туда. Когда эта линия будет достигнута, я вернусь к VS. Не забудьте удалить эту строку, когда вы закончите.ОБНОВЛЕНИЕ: В качестве альтернативы
#if DEBUG
прагме, вы также можете использоватьConditional("DEBUG_SERVICE")
атрибут.По вашему
OnStart
, просто вызовите этот метод:Там код будет включен только во время отладочных сборок. Несмотря на это, может быть полезно создать отдельную конфигурацию сборки для отладки службы.
источник
Я также думаю, что иметь отдельную «версию» для нормального выполнения и в качестве службы - это путь, но действительно ли для этого нужно выделять отдельный переключатель командной строки?
Не могли бы вы просто сделать:
Это принесло бы «выгоду»: вы можете просто запустить свое приложение с помощью двойного щелчка (ОК, если вам это действительно нужно), и вы можете просто нажать F5в Visual Studio (без необходимости изменять настройки проекта, чтобы включить этот параметр
/console
).Технически,
Environment.UserInteractive
проверяется, установлен лиWSF_VISIBLE
флаг для текущей оконной станции, но есть ли какая-либо другая причина, по которой он должен вернутьсяfalse
, кроме как запуск (неинтерактивная) служба?источник
System.Diagnostics.Debugger.IsAttached
вместоEnvironment.UserInteractive
.Когда я создал новый сервисный проект несколько недель назад, я нашел этот пост. Хотя было много замечательных предложений, я так и не нашел решение, которое хотел: возможность вызывать классы обслуживания
OnStart
иOnStop
методы без какой-либо модификации классов обслуживания.Решение, которое я придумала, использует
Environment.Interactive
выбранный режим работы, как это предлагается в других ответах на этот пост.RunInteractive
Хелперы использует отражение для вызова защищенногоOnStart
иOnStop
методы:Это весь необходимый код, но я также написал пошаговое руководство с объяснениями.
источник
walk through
), это убедиться, что вы вошли в свойства проекта и изменили тип вывода наConsole Application
перед тем, как пытаться скомпилировать и запустить. Найдите это вProject Properties -> Application -> Output type -> Console Application
. Кроме того, для того, чтобы это работало правильно для меня, мне пришлось запустить приложение с помощьюstart
команды. Пример:C:\"my app name.exe" -service
не будет работать для меня. Вместо этого я использовалC:\start /wait "" "my app name.exe" -service
Иногда важно проанализировать, что происходит во время запуска службы.Присоединение к процессу здесь не помогает, потому что вы недостаточно быстры, чтобы подключить отладчик во время запуска службы.
Краткий ответ: я использую следующие 4 строки кода, чтобы сделать это:
Они вставляются в
OnStart
метод службы следующим образом:Для тех, кто не делал этого раньше, я включил подробные советы ниже , потому что вы можете легко застрять. Следующие советы относятся к Windows 7x64 и Visual Studio 2010 Team Edition , но должны быть применимы и для других сред.
Важно: разверните службу в «ручном» режиме (используя
InstallUtil
утилиту из командной строки VS или запустите подготовленный вами проект установщика службы). Откройте Visual Studio, прежде чем чем запускать службу, и загрузите решение, содержащее исходный код службы, - установите дополнительные точки останова по мере необходимости в Visual Studio, - затем запустите службу через панель управления .Из-за
Debugger.Launch
кода это вызовет диалоговое окно «Произошло необработанное исключение Microsoft .NET Framework в Servicename.exe ». появляться. Нажмите, как показано на скриншоте: Yes, debug Servicename.exeВпоследствии, особенно в Windows 7 UAC может попросить вас ввести учетные данные администратора. Введите их и выполните Yes:
После этого появляется хорошо известное окно отладчика Visual Studio Just-In-Time . Он спросит вас, хотите ли вы отладить с помощью удаленного отладчика. Прежде чем щелкнуть Yes, выберите, что вы не хотите открывать новый экземпляр (2-й вариант) - новый экземпляр здесь не будет полезен, поскольку исходный код не будет отображаться. Таким образом, вы выбираете экземпляр Visual Studio, который вы открыли ранее:
После того, как вы нажали Yes, через некоторое время Visual Studio покажет желтую стрелку прямо в строке, где находится
Debugger.Launch
оператор, и вы сможете отладить свой код (методMyInitOnStart
, который содержит вашу инициализацию).Нажатие F5немедленно продолжает выполнение, пока не будет достигнута следующая подготовленная вами точка останова.
Подсказка: чтобы сохранить работу сервиса, выберите « Отладка» -> «Отключить все» . Это позволяет запустить клиент, обменивающийся данными со службой после того, как он правильно запустился и вы закончили отладку кода запуска. Если вы нажмете Shift+F5 (прекратить отладку), это приведет к прекращению службы. Вместо того, чтобы сделать это, вы должны использовать панель управления службами, чтобы остановить его.
Обратите внимание, что
Если вы создаете Релиз, тогда код отладки автоматически удаляется и служба работает нормально.
Я использую
Debugger.Launch()
, который запускает и присоединяет отладчик . Я также проверилDebugger.Break()
, что не сработало , потому что при запуске службы еще не подключен отладчик (что вызвало «Ошибка 1067: процесс неожиданно завершился». ).RequestAdditionalTime
устанавливает более длительный тайм-аут для запуска службы (это не задерживает сам код, но немедленно продолжит выполнениеDebugger.Launch
инструкции). В противном случае время ожидания по умолчанию для запуска службы слишком короткое, и запуск службы завершается неудачно, если вы недостаточноbase.Onstart(args)
быстро вызываете из отладчика. Практически, 10-минутный тайм-аут предотвращает появление сообщения « служба не отвечает ...» сразу после запуска отладчика.Как только вы привыкнете к этому, этот метод очень прост, потому что он просто требует, чтобы вы добавили 4 строки в существующий сервисный код, что позволит вам быстро получить контроль и отладку.
источник
base.RequestAdditionalTime(600000)
служба управления службами не будет прерывать службу в течение 10 минут, если она не вызывает вbase.OnStart(args)
течение этого промежутка времени). Кроме того, я помню, что UAC также будет прерван, если вы не введете учетные данные администратора через некоторое время (я не знаю, сколько именно секунд, но я думаю, что вы должны ввести его в течение минуты, иначе UAC прерывает работу) , который завершит сеанс отладки.Обычно я инкапсулирую логику службы в отдельном классе и запускаю ее из класса «бегун». Этот класс бегуна может быть реальной службой или просто консольным приложением. Итак, ваше решение имеет (по крайней мере) 3 проекта:
источник
Это видео на YouTube от Фабио Скопеля объясняет, как довольно хорошо отлаживать службу Windows ... фактический способ сделать это начинается в 4:45 в видео ...
Вот код, описанный в видео ... в файле Program.cs, добавьте материал для раздела отладки ...
В своем файле Service1.cs добавьте метод OnDebug () ...
По сути, вы должны создать объект,
public void OnDebug()
который вызывает,OnStart(string[] args)
поскольку он защищен и недоступен снаружи.void Main()
Программа добавлена с#if
препроцессором с#DEBUG
.Visual Studio определяет
DEBUG
, скомпилирован ли проект в режиме отладки. Это позволит выполнить раздел отладки (ниже), когда условие выполненоИ он будет работать так же, как консольное приложение, как только все пойдет хорошо, вы можете изменить режим,
Release
и обычныйelse
раздел вызовет логикуисточник
ОБНОВИТЬ
Этот подход, безусловно, самый простой:
http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx
Я оставляю свой оригинальный ответ ниже для потомков.
Мои сервисы, как правило, имеют класс, который инкапсулирует Timer, так как я хочу, чтобы сервис регулярно проверял, есть ли какая-то работа для него.
Мы обновляем класс и вызываем StartEventLoop () во время запуска службы. (Этот класс также можно легко использовать из консольного приложения.)
Приятным побочным эффектом этого дизайна является то, что аргументы, с помощью которых вы устанавливаете таймер, могут использоваться для задержки перед тем, как служба фактически начнет работать, так что у вас будет время подключить отладчик вручную.
Также я делал следующее (уже упоминалось в предыдущих ответах, но с флагами условного компилятора [#if], чтобы избежать его запуска в сборке Release).
Я перестал делать это таким образом, потому что иногда мы забыли встроить Release и сделать перерыв в отладчике в приложении, запущенном на клиентской демонстрации (смущающе!).
источник
// do something
для завершения требуется более 30 минут?источник
OnStart
этоprotected
и вы не можете изменить уровень доступа :(Вы также можете запустить службу через командную строку (sc.exe).
Лично я запускал код как отдельную программу на этапе отладки, и, когда большинство ошибок устранено, переключаюсь на запуск в качестве службы.
источник
Я использовал переключатель командной строки, который запускал программу как службу или как обычное приложение. Затем в своей среде IDE я установил переключатель так, чтобы я мог шагать по своему коду.
С некоторыми языками вы можете определить, работает ли он в IDE, и выполнить это переключение автоматически.
Какой язык вы используете?
источник
Используйте библиотеку TopShelf .
Создайте консольное приложение, затем настройте настройки в главном
Чтобы отладить ваш сервис, просто нажмите F5 в visual studio.
Чтобы установить службу, введите cmd "console.exe install"
Затем вы можете запустить и остановить службу в диспетчере служб Windows.
источник
Я думаю, что это зависит от того, какую операционную систему вы используете, Vista гораздо сложнее подключить к Сервисам из-за разделения между сессиями.
Два варианта, которые я использовал в прошлом:
Надеюсь это поможет.
источник
Мне нравится иметь возможность отлаживать каждый аспект моего сервиса, включая любую инициализацию в OnStart (), и в то же время выполнять его с полным поведением сервиса в рамках SCM ... без режима «консоль» или «приложение».
Я делаю это, создавая второй сервис в том же проекте, чтобы использовать его для отладки. Служба отладки, когда запускается как обычно (то есть в плагине MMC служб), создает процесс узла службы. Это дает вам процесс присоединения отладчика, даже если вы еще не запустили свой реальный сервис. После подключения отладчика к процессу, запустите реальную службу, и вы сможете взломать ее в любом месте жизненного цикла службы, включая OnStart ().
Поскольку для этого требуется минимальное вмешательство кода, сервис отладки можно легко включить в проект установки службы и легко удалить из рабочего выпуска, закомментировав одну строку кода и удалив один установщик проекта.
Подробности:
1) Предполагая, что вы реализуете
MyService
, также создайтеMyServiceDebug
. Добавьте оба вServiceBase
массивProgram.cs
следующим образом:2) Добавьте реальный сервис И сервис отладки в установщик проекта для сервисного проекта:
Обе службы (реальная и отладочная) включаются при добавлении вывода проекта службы в проект установки для службы. После установки обе службы появятся в плагине MMC service.msc.
3) Запустите сервис отладки в MMC.
4) В Visual Studio присоедините отладчик к процессу, запущенному службой отладки.
5) Запустите реальный сервис и наслаждайтесь отладкой.
источник
Когда я пишу сервис, я помещаю всю сервисную логику в проект dll и создаю два «хоста», которые обращаются к этой dll, один - сервис Windows, а другой - приложение командной строки.
Я использую приложение командной строки для отладки и присоединяю отладчик к реальному сервису только для ошибок, которые не могу воспроизвести в приложении командной строки.
Если вы используете этот подход, просто помните, что вы должны тестировать весь код во время работы в реальном сервисе, в то время как инструмент командной строки является хорошим средством отладки, это другая среда и он не ведет себя точно так же, как реальный сервис.
источник
При разработке и отладке службы Windows я обычно запускаю ее как консольное приложение, добавляя параметр запуска / console и проверяя его. Делает жизнь намного проще.
источник
Как насчет Debugger.Break () в первой строке?
источник
Для отладки Windows Services я объединяю GFlags и файл .reg, созданный regedit.
Или сохраните следующие фрагменты и замените servicename.exe на нужное имя исполняемого файла.
debugon.reg:
debugoff.reg:
источник
Для рутинного мелкого программирования я сделал очень простой трюк, чтобы легко отладить мой сервис:
При запуске службы я проверяю параметр командной строки "/ debug". Если служба вызывается с этим параметром, я не делаю обычный запуск службы, а вместо этого запускаю все прослушиватели и просто отображаю окно сообщения «Выполняется отладка, нажмите ОК для завершения».
Поэтому, если мой сервис запускается обычным способом, он запускается как сервис, если он запускается с параметром командной строки / debug, он будет действовать как обычная программа.
В VS я просто добавлю / debug в качестве параметра отладки и сразу запущу сервисную программу.
Таким образом, я легко отлаживаю для большинства мелких добрых задач Конечно, некоторые вещи все равно нужно будет отлаживать как сервис, но для 99% это достаточно хорошо.
источник
источник
Я использую вариант ответа JOP. Используя параметры командной строки, вы можете установить режим отладки в IDE со свойствами проекта или через диспетчер служб Windows.
источник
Для устранения неполадок в существующей программе Windows Service, используйте Debugger.Break (), как предложили другие парни.
Для новой программы Windows Service я бы предложил использовать метод Джеймса Майкла Хэра http://geekswithblogs.net/BlackRabbitCoder/archive/2011/03/01/c-toolbox-debug-able-self-installable-windows-service-template- redux.aspx
источник
Просто поместите свой обед отладчика в любом месте и присоедините Visualstudio при запуске
Также вам нужно запустить VS от имени администратора и разрешить, чтобы процесс мог автоматически отлаживаться другим пользователем (как описано здесь ):
источник
Используйте проект шаблона службы Windows C # для создания нового приложения-службы https://github.com/HarpyWar/windows-service-template.
Есть автоматически обнаруженный консольный / сервисный режим, автоустановщик / деинсталлятор вашего сервиса и несколько наиболее часто используемых функций.
источник
Вот простой метод, который я использовал для тестирования сервиса, без каких-либо дополнительных методов «отладки» и с интегрированными VS Unit Tests.
источник
источник
У вас есть два варианта отладки.
Пожалуйста , обратитесь ЭТИМ сообщением в блоге , что я создал для этой темы.
источник
Просто вставьте
в любом месте вашего кода.
Например ,
Это ударит,
Debugger.Break();
когда вы запустите вашу программу.источник
Наилучшим вариантом является использование пространства имен System.Diagnostics .
Включите ваш код в блок if else для режима отладки и режима выпуска, как показано ниже, чтобы переключаться между режимом отладки и выпуска в Visual Studio,
источник