отладка службы Windows - PullRequest
       17

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

2 голосов
/ 14 января 2010

Я пытаюсь отладить службу Windows в Visual Studio 2005 на компьютере с Windows XP. Я могу установить службу Windows и запустить ее из консоли администратора. Однако процесс отображается отключенным в списке доступных процессов, и я не могу прикрепить к нему отладчик. Что я могу сделать, чтобы включить процесс в список доступных процессов?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 14 января 2010

У меня есть маленькая хитрость, которая позволяет легко отлаживать. Это в основном превращает сервис в приложение командной строки, поэтому вы можете отлаживать его. Вот код:

Добавить это в Program.cs (внутри void Main ()

#if (!DEBUG)
    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[] { new PollingService() };
    ServiceBase.Run(ServicesToRun);
#else
    // Debug code: this allows the process to run as a non-service.
    MyService service = new MyServiceService();
    service.OnStart(null);

    //Use this to make the service keep running
    // Shut down the debugger to exit
    System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);

    //Use this to make it stop
    //System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10));
    //service.OnStop();
#endif

затем добавьте это к методу OnStart в службе:

#if (!DEBUG)
    protected override void OnStart(string[] args)
#else
    public new void OnStart(string[] args)
#endif

и это для метода OnStop

#if (!DEBUG)
    protected override void OnStop()
#else
    public new void OnStop()
#endif
3 голосов
/ 14 января 2010

Здесь есть несколько полезных опций.

Сначала я бы порекомендовал написать подпрограмму Main () для всех ваших служб Windows для поддержки их запуска в качестве службы Windows или в виде консольного приложения. Таким образом, вы можете запустить консоль для отладки. Упрощенная процедура Main () может выглядеть так:

    private static void Main(string[] args)
    {
        _service = new Service();

        if (args.Length == 0 && !Debugger.IsAttached)
        {
            Run(new ServiceBase[] {_service});
        }
        else
        {
            Console.WriteLine("Starting Service...");
            _service.OnStart(new string[0]);
            Console.WriteLine("Service is running...  Hit ENTER to break.");
            Console.ReadLine();
            _service.OnStop();
        }
    }

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

Другой вариант - добавить оператор Debugger.Break () в ваш код. Затем вы можете запустить службу как обычно, и когда она достигнет этой точки, она предложит пользователю подключить отладчик.

1 голос
/ 14 января 2010

Возможно, у вас нет прав для присоединения к процессу. Убедитесь, что вы запустили Visual Studio с учетной записью администратора.

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