我有一个带定时器的Windows服务。很难调试它。因为我启动服务并在代码的不同部分放置断点。当我附上这个过程时,我希望服务从一开始就开始,而不是在我有断点的中间代码中的一些randome位置。它很难像普通应用程序一样调试,你知道起点。看来背景中的流程还没有完成。所以每一次,我开始调试,而不是从第一个断点开始,它从应用程序中间的一些随机断点开始。
我想知道windows服务在进程,线程等方面是如何工作的......我怎样才能从头开始调试?
答案 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)
它不像调试器中的断点那样方便,但我发现将输出写入简单的日志文件有帮助。我们有产生线程来执行工作的服务,并且写出日志文件有助于查明问题。