Как отладить службу Windows, используя точки останова? - PullRequest
5 голосов
/ 17 апреля 2009

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

Я хочу знать, как работает служба Windows с точки зрения процессов, потоков и т. Д. И как я могу начать отладку с самого начала?

Ответы [ 5 ]

9 голосов
/ 17 апреля 2009

Полагаю, вы говорите о .Net, конечно. Я всегда использовал следующий код для отладки своих сервисов. Я помещаю его туда, куда хочу запустить отладчик. Запустите службу, и она автоматически запустит Visual Studio. Хорошо работает для меня.

System.Diagnostics.Debugger.Launch();

System.Diagnostics.Debugger.Debug();

2 голосов
/ 18 апреля 2009

Просто нажмите F5. Вы можете запускать службы Windows как обычные приложения.

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

If sArgs IsNot Nothing AndAlso sArgs.Length > 0 Then
    ' If there are command-line args then run in non-service mode
    Dim svc As ServiceMain = New ServiceMain(True)
    svc.OnStart(Nothing)
    System.Windows.Forms.Application.Run()
    svc.OnStop()
Else
    ' If no command-line args then run normally
    Dim ServicesToRun() As System.ServiceProcess.ServiceBase
    ServicesToRun = New System.ServiceProcess.ServiceBase() {New ServiceMain(False)}
    System.ServiceProcess.ServiceBase.Run(ServicesToRun)
End If
1 голос
/ 25 апреля 2009

Вы можете использовать «Параметры выполнения файла изображения» и настроить его при каждом запуске службы в самом отладчике.
Этот отладчик может быть WinDBG или Visual Studio.

0 голосов
/ 20 апреля 2009

Это не так удобно, как точки останова в отладчике, но я обнаружил, что запись выходных данных в простые файлы журналов помогает. У нас есть сервисы, которые порождают потоки для выполнения работы, а запись в файл журнала помогает точно определять проблемы.

0 голосов
/ 17 апреля 2009

Самый простой подход ...

Поместите бизнес-функциональные части служебного кода в отдельный класс, в отдельную библиотечную сборку ... Затем вы можете независимо отлаживать его с помощью простого консольного приложения ...

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