Отладка службы Windows - PullRequest
       53

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

41 голосов
/ 13 апреля 2010

Сценарий

У меня есть служба Windows, написанная на C #. Я прочитал все темы Google о том, как отладить его, но я до сих пор не могу заставить его работать. Я запустил «PathTo.NetFramework \ InstallUtil.exe C: \ MyService.exe». Он сказал, что установка прошла успешно, однако, когда я запускаю «Services.msc», служба вообще не отображается нигде. Если я захожу в диспетчер задач, есть процесс под названием «MyService.vshost.exe». Уверен, что это не так, потому что это услуга, а не процесс.

Может ли кто-нибудь объяснить мне?

Должен ли я видеть службу при запуске Services.msc? (Учитывая, что все это делается на локальной машине, без серверов ВСЕ.

Другое

Я использую VS2008.

EDIT:

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

РЕДАКТИРОВАТЬ 2:

Никто из них не работает! Каждый раз, когда я что-то пробую, я получаю сообщение о необходимости использовать NET START или установить службу.

РЕДАКТИРОВАТЬ 3:

Я использую VS2008.

Я набрал это: C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ InstallUtil.exe C: \ dev \ Restarter \ bin \ Release \ Restarter.exe

Я получил это: Утилита установки Microsoft (R) .NET Framework Версия 2.0.50727.3053 Авторские права (c) Корпорация Microsoft. Все права защищены.

Запуск транзакционной установки.

Начало фазы установки установки. Смотрите содержимое файла журнала для C: \ dev \ Restarter \ bin \ Выпуск сборки \ Restarter.exe. Файл находится по адресу C: \ dev \ Restarter \ bin \ Release \ EDT.Restar. ter.InstallLog. Установка сборки «C: \ dev \ Restarter \ bin \ Release \ Restarter.exe». Затрагиваемые параметры: logtoconsole = assemblypath = C: \ dev \ Restarter \ bin \ Release \ Restarter.exe logfile = C: \ dev \ Restarter \ bin \ Release \ Restarter.InstallLog

Фаза установки успешно завершена, и фаза фиксации начинается. Смотрите содержимое файла журнала для C: \ dev \ Restarter \ bin \ Выпуск сборки \ Restarter.exe. Файл находится по адресу C: \ dev \ Restarter \ bin \ Release \ Restar ter.InstallLog. Фиксация сборки «C: \ dev \ Restarter \ bin \ Release \ Restarter.exe». Затрагиваемые параметры: logtoconsole = assemblypath = C: \ dev \ Restarter \ bin \ Release \ Restarter.exe logfile = C: \ dev \ Restarter \ bin \ Release \ Restarter.InstallLog

Фаза фиксации успешно завершена.

Транзакционная установка завершена.

C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC>

Я тогда пошел в RUN -> Services.msc Я ничего не вижу там.

В диспетчере задач есть процесс, который называется Restarter.vshost.exe.

Вот и все.

Я только хотел установить и отладить его. Я знаю, что это работает (как это работает и не падает). Но код был написан другом, и я хочу понять базовый код, пройдя его в режиме отладки.

Ответы [ 11 ]

115 голосов
/ 13 апреля 2010

Я рекомендую следующий шаблон для отладки:

 var ServiceToRun = new SomeService(); 
 if (Environment.UserInteractive)
 {
    // This used to run the service as a console (development phase only)

    ServiceToRun.Start();

    Console.WriteLine("Press Enter to terminate ...");
    Console.ReadLine();

    ServiceToRun.DoStop();
 }
 else
 {
    ServiceBase.Run(ServiceToRun);
 }

Редактировать: убедитесь, что ваша цель - Консольное приложение, а не приложение Windows, иначе оно не будет работать.

23 голосов
/ 13 апреля 2010

вы можете отладить его, подключив отладчик к процессу. Вы можете сделать это, добавив строку к запуску вашей программы:

Debugger.Launch ();

после добавления оператора using:

using System.Diagnostics; 

вам нужно будет либо поместить это в условный блок, либо удалить, когда вы закончите отладку

или запустив службу, а затем подключившись к процессу вручную из IDE: Отладка-> Присоединить к процессу.

6 голосов
/ 18 октября 2011

Мы можем сделать отладку проекта службы Windows, просто добавив параметр и сделав его похожим на консольное приложение.

1) Зайдите в свойства вашего проекта службы Windows -> Отладка -> Параметры запуска 2) Приведите аргумент - Консоль 3) Перейдите на вкладку Приложение -> тип вывода, измените его на Консольное приложение 4) Введите приведенный ниже код в Program.cs

static class Program
    {
        private static EventWaitHandle _waitHandle;
        private static Service1 _service;
                static void Main(string[] args)
        {
            bool runConsole = false;**

            foreach (string arg in args)
            {
                if (arg.ToLowerInvariant().Equals("-console"))
                {
                    runConsole = true;
                }
            }   

            _service = new Service1();
            if (runConsole)
            {
                _waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
                Console.WriteLine("Starting Workflow Service in Console Mode");
                Console.WriteLine("Press Ctrl+C to exit Console Mode");
               Console.CancelKeyPress += new ConsoleCancelEventHandler(OnCancelKeyPress);
                _service.InternalStart();
                WaitHandle.WaitAll(new WaitHandle[] { _waitHandle });
            }

            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new Service1() 
            };
            ServiceBase.Run(ServicesToRun);
        }

        static void OnCancelKeyPress(object sender, ConsoleCancelEventArgs e)
        {
            _service.InternalStop();
            _waitHandle.Set();
        }


    }
5 голосов
/ 05 августа 2011

Это очень помогло мне при разработке / отладке служб Windows:

http://windowsservicehelper.codeplex.com/

Просто нажмите F5 для отладки. Очень просто.

Подход Андрея тоже очень хорош.

4 голосов
/ 26 марта 2014

Чтобы иметь возможность отладить мой сервис без его развертывания, я всегда пишу его следующим образом:

В вашем файле program.cs:

#if DEBUG
    MyService myService = new MyService();
    myService.OnDebug();
    System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#else
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[]
    {
        new MyService()
    };
    ServiceBase.Run(ServicesToRun);
#endif

и в вашем файле MyService.cs:

    public void OnDebug()
    {
        OnStart(null);
    }

* ПРИМЕЧАНИЕ *: необходимо выполнить сборку в режиме «Release», когда вы, наконец, закончили с отладкой и готовы развернуть службу, в противном случае служба не будет считаться службой.

Надеюсь, это поможет.

2 голосов
/ 13 апреля 2010

Предположения:

1) У вас есть исходный код, доступный в решении в IDE VS2008

Как отлаживать службы C #:

  1. Установите Сервис, используя InstallUtil. (Вы, кажется, уже сделали это)
  2. (при необходимости) Измените путь службы на MyService.exe, который создается в папке bin вашего решения
  3. Поместите что-то вроде следующего в начале метода OnStart() вашей Службы:

    while(true)
    {
       System.Threading.Thread.Sleep(500);
    }
    
  4. Установить точку останова на System.Threading.Thread.Sleep(500)

  5. Построить решение

  6. Запустите службу с помощью служебной программы Windows

  7. Пока ваша служба запускается, в VS2008 перейдите на Debug -> Attach To Processes...

  8. Убедитесь, что Show Processes From All Users и Show Processes In All Sessions проверены

  9. Найдите MyService.exe в списке и нажмите Attach

  10. Теперь вы должны быть в точке останова, которую вы вставили в бесконечный цикл

  11. Перетащите элемент управления (желтая стрелка) просто за пределы бесконечного цикла

  12. Отладка!

Отказ от ответственности:

Не забудьте удалить бесконечный цикл, когда вы хотите выпустить сборку, или когда вы просто хотите нормально запустить службу.

1 голос
/ 13 апреля 2012

Может быть, имя службы не то, что вы ожидаете, и поэтому вы не можете его найти. Имя службы определено в ServiceInstaller свойствах проекта .NET и не должно каким-либо образом соответствовать имени исполняемого файла. Но если вы уверены, что сервис не указан в списке после установки, вот что вы можете сделать.

Во-первых, сервисная установка. Есть 2 метода, InstallUtil.exe и SC.exe. Первый из них специально предназначен для сервисов .NET, так как он будет выполнять весь код ProjectInstaller и ServiceInstaller. Второй не будет этого делать, но он даст вам больше возможностей и, как правило, более эффективен, то есть, вероятно, преуспеет в случае неудачи InstallUtil. Это может быть, когда есть исключение в любом коде установщика.

Вы уже пытались установить с InstallUtil, так что вот SC версия:

sc create MyService binPath= "C:\Service.exe"

Обратите внимание, что MyService - это имя , которое вы даете службе на данный момент, и это может быть что угодно (в пределах разумного :-). Это имя будет отображаться в списке консоли служб.

После того, как у вас установлена ​​служба, вам нужно будет отладить ее правильно при вызове OnStart. Это может быть достигнуто путем запуска и подключения к отладчику (Visual Studio) из службы:

protected override void OnStart(string[] args)
{
    #if DEBUG
    Debugger.Launch();
    #endif
    ...
}

Не забудьте собрать и заменить исполняемый файл службы после этого изменения кода. Служба должна быть остановлена, но ее не нужно удалять и переустанавливать.

Чтобы удалить услугу, используя SC:

sc delete MyService
0 голосов
/ 12 апреля 2017

Если вы создаете свой сервис с помощью TopShelf, вы сможете легко отлаживать его из Visual Studio

0 голосов
/ 28 мая 2013

Рекомендую добавить /test на вкладке отладки свойств проекта в качестве опции запуска. Затем вы можете запустить свой сервис без необходимости его установки.

0 голосов
/ 13 апреля 2010

Я недавно добавил это в проект, и он прекрасно работает для меня. Вы можете отладить его, как и любой другой EXE. После его добавления перейдите в свойства вашего проекта и добавьте параметр командной строки (/ EXE) на вкладке «Отладка» для конфигурации сборки отладки.

<MTAThread()> _
Shared Sub Main()

    '' 
    '' let's add a command line parameter so we can run this as a regular exe or as a service
    ''
    If Command().ToUpper() = "/EXE" Then
        Dim app As MyService = New MyService()

        app.OnStart(Nothing)
        Application.Run()
    Else
        Dim ServicesToRun() As System.ServiceProcess.ServiceBase

        ' More than one NT Service may run within the same process. To add
        ' another service to this process, change the following line to
        ' create a second service object. For example,
        '
        '   ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService}
        '
        ServicesToRun = New System.ServiceProcess.ServiceBase() {New MyService}

        System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...