2010-01-14 5 views
2

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

Спасибо!

ответ

1

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

+0

+1 просто хотел сказать это. –

3

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

Добавить это Program.cs (внутри пустоты 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

Есть несколько полезных вариантов здесь.

Сначала я бы рекомендовал написать процедуру 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(). Затем вы можете запустить службу как обычно, и когда она ударит по этой точке, она предложит пользователю подключить отладчик.

+0

Это именно то, что мне нужно. –

+0

Для того, чтобы это сработало, OnStart и OnStop должны быть изменены с 'protected override' на' public new' –

+0

@Gabriel McAdams, если вы не поместили основной класс внутри службы. –

Смежные вопросы