Debug Windows Service

后端 未结 11 1371
既然无缘
既然无缘 2020-11-29 17:09

Scenario

I\'ve got a windows service written in C#. I\'ve read all the google threads on how to debug it, but I still can\'t get it to work. I\'ve run \"PathTo.Net

相关标签:
11条回答
  • 2020-11-29 18:06

    It can be that service name is not what you expect and that's why you can't find it. Service name is defined in ServiceInstaller properties in .NET project and does not have to correspond with executable name in any way. But if you're sure the service is not listed after installation, here is what you can do.

    First, service installation. There are 2 methods, InstallUtil.exe and SC.exe. First one is tailored specifically for .NET services as it will run all ProjectInstaller and ServiceInstaller code. Second one will not do that but it will give you more options and is usually more effective i.e. likely to succeed where InstallUtil fails. This can be when there is an exception in any installer code.

    You've already tried installing with InstallUtil so here is SC version:

    sc create MyService binPath= "C:\Service.exe"
    

    Note that MyService is the name you give to the service at this point and it can be anything you like (within reason :-). This name will be shown in services console list.

    Once you have your service installed you would need to debug it right when OnStart is called. This can be achieved by running and attaching to a debugger (Visual Studio) from within the service:

    protected override void OnStart(string[] args)
    {
        #if DEBUG
        Debugger.Launch();
        #endif
        ...
    }
    

    Do not forget to build and replace service executable after this code change. Service must be stopped but no need to uninstall and reinstall it.

    To delete service using SC:

    sc delete MyService
    
    0 讨论(0)
  • 2020-11-29 18:07

    Assumptions:

    1) You have the source code available in a Solution in the VS2008 IDE

    How I Debug C# Services:

    1. Install the Service using InstallUtil. (You seem like you've already done that)
    2. (If Needed) Change the Service path to the MyService.exe that is produced in your Solution's bin folder
    3. Put something like the following at the beginning of your Service's OnStart() method:

      while(true)
      {
         System.Threading.Thread.Sleep(500);
      }
      
    4. Put a breakpoint on System.Threading.Thread.Sleep(500)

    5. Build the Solution

    6. Start your Service using the Windows Service Utility

    7. While your Service is starting, in VS2008 goto Debug -> Attach To Processes...

    8. Make sure Show Processes From All Users and Show Processes In All Sessions are checked

    9. Find your MyService.exe in the list, and click Attach

    10. You should now be at the breakpoint you inserted in the infinite loop

    11. Drag the Control (Yellow Arrow) just outside the infinite loop

    12. Debug away!

    Disclaimer:

    Remember to remove the infinite loop when you want to release a build, or when you simply want to run the service normally.

    0 讨论(0)
  • 2020-11-29 18:08

    you can debug it by attaching the debugger to the process. You can do this by either adding a line to the startup of your program:

    Debugger.Launch ();
    

    after adding the using statement:

    using System.Diagnostics; 
    

    you will either need to put that in a conditional block or remove it when you are done debugging

    or by running the service and then attaching to the process manually from the IDE: Debug->Attach to process..

    0 讨论(0)
  • 2020-11-29 18:09

    We can make the windows service project debuggable by just adding a parameter and making it behave like a console app.

    1) Go to your windows service project properties -> Debug -> Start Options 2) Give an argument -Console 3) Go to Application tab -> output type, change it to Console Application 4) Type the below code in Program.cs

    static class Program
        {
            private static EventWaitHandle _waitHandle;
            private static Service1 _service;
                    static void Main(string[] args)
            {
                bool runConsole = false;**
    
                foreach (string arg in args)
                {
                    if (arg.ToLowerInvariant().Equals("-console"))
                    {
                        runConsole = true;
                    }
                }   
    
                _service = new Service1();
                if (runConsole)
                {
                    _waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
                    Console.WriteLine("Starting Workflow Service in Console Mode");
                    Console.WriteLine("Press Ctrl+C to exit Console Mode");
                   Console.CancelKeyPress += new ConsoleCancelEventHandler(OnCancelKeyPress);
                    _service.InternalStart();
                    WaitHandle.WaitAll(new WaitHandle[] { _waitHandle });
                }
    
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] 
                { 
                    new Service1() 
                };
                ServiceBase.Run(ServicesToRun);
            }
    
            static void OnCancelKeyPress(object sender, ConsoleCancelEventArgs e)
            {
                _service.InternalStop();
                _waitHandle.Set();
            }
    
    
        }
    
    0 讨论(0)
  • 2020-11-29 18:10

    If your business layer is seperate from the windows service you can test all of your business functions outside of running the windows service.

    To test the windows service I like to create a test project that is a console app and I start a new thread that runs my service.

    System.Threading.Thread sftpThread = new System.Threading.Thread((ThreadStart)service1);
    service1.Start();
    
    0 讨论(0)
提交回复
热议问题