How do you debug a windows service that is being installed?

I know how to attach a debugger to a windows service, but I can't seem to get attached to one that's being installed and started by a windows installer. I've tried:

  1. Setting a Thread.Sleep(TimeSpan.FromSeconds(30)); at the beginning of the on-start, but when I try to attach in Visual Studio, the name of the service does not appear as an option. This normally works, the service's name shows up in the list, but when using the installer it does not.

  2. Setting a Debugger.Break and Debugger.Launch. Neither really do anything.

What can I do to debug my service?

Update:

I added a Thread.Sleep for 30 seconds as the first line of the service, and when the installer is prompting me for what it should do when it fails, I start the service in the service list (since it hasn't been removed), and it fails instantly, without the 30 second wait. The files it installs are the latest (they've got the right modified time). The 30 second pause occurs if I run the same client from my test app in the same project, but for some reason the installer is screwing with something.

I'm really not sure how to debug this, and the frustrating thing is that this service used to work properly.

Answer:

Checking the application log showed me the exception that was being thrown. It turned out I had accidentally clobbered a file in my installer, which explains why none of my debugging techniques worked. Once I restored the file, I was able to attach with visual studio as normal (using a 30 second pause to give me time).

Answers


  1. In services.msc, right click on your service and choose properties.
  2. In the Log On tab enabled Allow the service to interact with the desktop.
  3. Add something like Debug.Assert(false, "attach now"); to your ServiceBase's OnStart method.
  4. Attach to the process and click ignore in the assert dialog.

Edit 1: Things that occurr to me, in no particular order;

If it used to work, is it possible that it's no longer running as the same user? Maybe the new user doesn't have the same permissions or the permissions changed.

Use the Event Viewer to check the Application log.

If a problem is happening during the installation process there may be some info in InstallUtil.InstallLog or {assemblyname}.InstallLog, these would be in the same directory as the .exe.

I'm doing this from my Linux laptop, so I'm a bit fuzzy.

Edit 2:

In the service manager, right click on your service and choose properties. Verify that the service to pointing to the correct executable; I've seen post build steps do funky things.


When you attach the VS debugger, make sure that the "Show processes from all users" is checked. Your service is probably running under Local Service or Local System.


Here are couple of links that would help you troubleshoot windows service start-up in production where you don't have VS.NET. This can also be used in Dev.

  1. First
  2. Second

Need Your Help

Download existing file from IIS results in File does not exists (404)

asp.net iis

I have a full working web site that i ported to a new hosting company.

how to split strings in objective c

iphone objective-c ios nsstring stringtokenizer

How to split a string in objective-C? I am working on an short application that contains a date picker. I do display date get it from date picker and display it through a label.