如何使用断点调试Windows服务?

时间:2009-04-17 16:23:36

标签: .net debugging windows-services

我有一个带定时器的Windows服务。很难调试它。因为我启动服务并在代码的不同部分放置断点。当我附上这个过程时,我希望服务从一开始就开始,而不是在我有断点的中间代码中的一些randome位置。它很难像普通应用程序一样调试,你知道起点。看来背景中的流程还没有完成。所以每一次,我开始调试,而不是从第一个断点开始,它从应用程序中间的一些随机断点开始。

我想知道windows服务在进程,线程等方面是如何工作的......我怎样才能从头开始调试?

5 个答案:

答案 0 :(得分:9)

我假设你当然在谈论.Net。我总是使用以下代码来调试我的服务。我把它放在我想要调试器启动的地方。启动该服务,它会自动启动Visual Studio。对我来说效果很好。

System.Diagnostics.Debugger.Launch();

System.Diagnostics.Debugger.Debug();

答案 1 :(得分:2)

按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

答案 2 :(得分:1)

您可以使用"Image File Execution Options"并配置每次服务启动它将在调试器内启动 该调试器可以是WinDBG或Visual Studio。

答案 3 :(得分:0)

最简单的方法......

将服务代码的业务功能部分放在一个单独的类中,放在一个单独的库程序集中......然后,您可以使用简单的控制台应用程序独立调试它...

答案 4 :(得分:0)

它不像调试器中的断点那样方便,但我发现将输出写入简单的日志文件有帮助。我们有产生线程来执行工作的服务,并且写出日志文件有助于查明问题。