Как стать автором
Обновить

Комментарии 47

Пустой проект создать не сложно…
Убивают нюансы)
Например, удаление сервиса всё также через одно место, если открыто окно сервисов — получите ошибку.
Отладка это наше всё… Если есть ошибка в процедуре(не синтаксическая, конечно, например, неверный ип для коннекта), то без поллитры не разберёшся, вызвалась ли эта процедура вообще(разумеется, возмоности чуть более вменяемой отладки требуют покупки Ultimate лицензии). И прочее, прочее…
Для «вменяемой отладки» достаточно писать вменяемые логи и расставлять вменяемые ассерты.

О, поколение, испорченное дебаггерами…
НЛО прилетело и опубликовало эту надпись здесь
То есть точки остановки как бы не нужны?
Вообще интерактивный дебаг как бы не нужен. Точнее, он очень нужен для посмертного вскрытия корок, и для отладки чужого и очень плохого кода.

А свой код можно и нужно изначально писать так, чтобы пользоваться правильными техниками отладки. Без всяких там break points и прочего.
Коммент, достойный уважения)
На моей памяти(могу и раскопать тот специфический проектик на C#), даже запись лога в том варианте просто кричала о том, что процедура не была вызвана.

Тоесть, функция вида
{
запись в лог 1;

строка с ошибкой в создании объекта;

запись в лог 2;
return ...;
}

Не делала записей в лог-файл вообще. Attach-to-proccess также показывал пропуск этой процедуры. При исключении же строки с ошибкой процедура выполнялась.
Отладили как раз созданием консольного приложения, где эта процедура всё-таки вызывалась, хоть и с ошибкой.
А вы лог флашили?

Вообще, первое правило — писать вывод логов и ассерты сразу и везде. Это, кроме всего прочего, еще и дополнительные аннотации к коду, проще читать потом будет. Нельзя проверки просто навешать потом на код вокруг подозрительного места — ведь реально ошибка может быть где-то еще, далеко от того, где все сломалось.
Что более забавно, изначально, лог флашился только на событиях опаснее некоторого уровня и при остановке сервиса, впрочем, исправление не привело прямиком к успеху.
После работы посмотрю, что там конкретно было, но повторюсь — функция, согласно дебаггеру, вообще не вызывалась.
Кстати, «опасный» код был в блоке try, у которого в catch также была запись в лог, что добавило к ловле блох как минимум час.
Все эти симптомы говорят, что реальная ошибка где-то вовсе за пределами этого блока кода. Довольно редкий случай в .NET, правда, если unmanaged-вызовами особо не баловаться.
Эта строка создавала подключение к SIMATIC OPC Server.
Соседнее же присоединение к PostgreSQL при неверных параметрах выдавало вполне вменяемое исключение.

Мой опыт в .NET довольно скромен, потому склонен довериться Вашему мнению.

Всё же, убивали в сервисах именно нюансы, и с первой попытки запустить что-либо сложнее приведённого примера может выйти не у каждого.
Более того, для вменяемой отладки нужно несколько способов запуска приложения: один — запуск в виде сервиса, двугой — в виде стандартного консольного приложения, в котором вся отладка прекрасно работает. Запустил приложение без ключа — стандартное консольное приложение, запустил с ключом /service — сервис.
Есть и вариант наоборот (для .NET и Java и вообще любой рефлексивной среды работает идеально) — встроить в приложение консоль для отладки. REPL какого либо скриптового языка, к которому можно подцепиться telnet-ом, и не прерывая работы выполнить произвольный код в контексте приложения.
Подскажите, пожалуйста, где про это поподробнее почитать можно.
НЛО прилетело и опубликовало эту надпись здесь
По собственному опыту — легче сначала разрабатывать в виде консольного приложения, затем оформлять его в виде сервиса.
А что, разве нельзя сделать «Attach to process»? Там ведь не так сложно было. Я правда сервисы не писал давно (около двух лет), поэтому могу не помнить подробностей. Просто запускаешь службу, делаешь «Attach to process», выбираешь показывать все процессы, выбираешь нужный и можно дебажить пошагово. VS была, если не ошибаюсь, 2008 Prof, но думаю такая возможность и в express есть (не могу проверить).
Можно, это работает. Проблема в том что так вы не сможете отдебажить стартап код.
Ну я в свое время (давно уже) писал такое: bitbucket.org/jonie/winsrvdebughelper
Просто давите F5 в проекте и получаете окно управления проектными сервисами (их может быть не один в рамках одного проекта)… конечно, надо учитывать права из под кого будет запускаться сервис в дебаге и в реальности (как раз в примере по ссылке производится запись в корень C:\ что даст сбой при ограниченном аккаунте).

ЗЫ: у автора может быть проблемы с вылетанием при записи логов при сильно ограниченном аккаунте под кем стартует сервис…
нет, не будет вылетаний, там же try
Не знаком с тонкостями .Net приложений, но в плюсах просто декларировал время старта сервиса порядка 15 секунд и при старте Sleep секунд на 10, за это время вполне успеваешь приаттачить отладчик.
Извращение конечно, но ошибку поймать удалось (не правильно прописал одно из полей).
Слишком «для школьников»
так а зачем всё усложнять если оно так и есть ;)
Для отладки я использую такую схему:
Всю логику сосредотачиваю в dll, которую подключаю к сервису.
Плюс к этому я создаю обычный винформс аппликейшн, к которому тоже подрубаю эту dll.
Вот тут разворачивается простор для дебага.

А описанный мною в статье шаблон сервиса отлично подходит как раз для подключения и использования какой-нить библиотеки.
Вообщето для отладки достаточно скомпилировать проект. Инсталировать сервис, и при запуске сервиса в течении 30 секунд присоединится к процессу сервиса, ну и ставить бряки в сырцах сервиса. Вуаля, дебаг аналогичный как и дебаг простого приложения.
А если нужно дебажить прямо со старта сервиса, и не хочется вставлять таймауты, что бы успеть приаттачится, то можно первой коммандой сделать.

Debugger.Launch();
Это тоже работает. А можно как делает 99% человечества, а именно в конскольке запускать.
И кстати, метод OnStart в сервисе должен отработать за указанные 30 секунд, иначе получим ошибку запуска сервиса.
У меня тоже есть пост на тему написания сервисов. В посте показан поллинг-сервис с саморегистрацией и запуском из консоли — эти две фичи у меня фигурируют во всех сервисах.

Вообщем, имхо, хабру нужны более техничные статьи — тема-то большая.
Поддерживаю, все сервисы пишу с саморегистрацией и возможность работы просто из командной строки — запустить без инсталяции и чтобы так же выполнял свои задачи. Во время разработки очень удобная штука, не нужно устанавливать сервис, а просто отлаживаешь как обычное консольное приложение.
проще воспользоваться прогами вроде AppToService, которые любой приложение умеют запускать как службу.
тогда тем более не понятно о чём топик. Переизобретение велосипеда?
НЛО прилетело и опубликовало эту надпись здесь
«Многие из нас сталкиваются с такой задачей, когда нужно запускать своё приложение при запуске компьютера. Конечно можно поместить ярлык в автозагрузку, но как-то это неправильно. Да к тому же если комп перегрузился, а пользователь не залогинелся, то и ваше приложение тоже не запустится. „

А вы путаете сервис и приложение. Приложение при запуске компьютера надо запускать автораном или аналогами вроде шедулера и так далее. А сервис — это отдельный класс программ, выполняющих свои собственные задачи.

В частности, сервис надо писать так, чтобы он умел работать в Non-interactive (без окон, консоли, без всего), и умел корректно закрываться по соответствующим командам системы. Приложению на это начхать.
Ваш копетан )
Переписанная статься из мсдн с кучей ошибок, что может быть более достойно главной?
НЛО прилетело и опубликовало эту надпись здесь
Я вообще давно написал вот такой универсальный скелетон для службы, который можно положить в common.dll и использовать во всех своих проектах, там же и пример использования, не претендую на оригинальность, код вбирает в себя все что было в туториалах, плюс то что понадобилось для себя
pastebin.com/yje1MzWA
Там кстати добавлена возможность указания имени службы при установке через Installutil, использовать можно так:
installutil /serviceName=CompanyName.Service serviceApp.exe
забыл написать, пришлось ждать 5 минут )
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Агент нужен в том же контексте, что и торрент-софтина
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации