views:

815

answers:

5

I have a windows service with a timer. Its very hard to debug it. Because I start the service and put break points in different parts of the code. When I attach the process, I expect the service to start from the very beginning instead of some randome place in the middle code where I have break points. Its hard to debug like a normal application where you know the starting point. It appears that there are processes in the back ground that have not completed yet. So every single time, I start to debug, instead of starting from the very first break point, it starts from some random break point in the middle of application.

I want to know how windows service works in terms of processes, threads etc... and how can I start debugging from the beginning?

A: 

Simplest approach...

Put the business - functional portions of the service code in a separate class, in a separate library assembly... Then you can debug it independantly using a simple console app...

Charles Bretana
this is a production application and I can not change the source code at the moment.
dotnet-practitioner
+3  A: 

I assume you're talking about .Net of course. I've always used the following code to debug my services. I place it where I want to the debugger to launch. Start the service and it automatically launches Visual Studio. Works well for me.

System.Diagnostics.Debugger.Launch();

System.Diagnostics.Debugger.Debug();

Daud
Thanks for the feedback. Yes, I am talking about .net and I will google your instruction set to see how this would work.
dotnet-practitioner
You can use this code for the debugging. But don't forget to remove it later when you're done. You would of course need to recompile the service after you make any changed.
Daud
+2  A: 

Just press F5. You can run Windows Services regular just like apps.

Since we have no other command-line arguments we just use the presense of any command-line argument as a signal to run as a normal windows app. You could also require the presence of a specific command-line argument (i.e. /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
MattH
A: 

It is not as convenient as breakpoints in the debugger but I found writing output to a simple log files helps. We have services that spawn threads to perform work and writing out to a log file has helped pinpoint problems.

Ron Skufca
+1  A: 

You can use "Image File Execution Options" and configure that each time that the service start it would start inside a debugger.
That debugger can be WinDBG or Visual Studio.

Shay Erlichmen