Procedura: Eseguire il debug di applicazioni di servizio di WindowsHow to: Debug Windows Service Applications

Poiché un servizio deve essere eseguito dall'interno del contesto di Gestione controllo servizi e non dall'interno di Visual Studio,A service must be run from within the context of the Services Control Manager rather than from within Visual Studio. il debug di un servizio non è semplice come quello di altri tipi di applicazioni di Visual Studio.For this reason, debugging a service is not as straightforward as debugging other Visual Studio application types. Per eseguire il debug di un servizio, è necessario avviare il servizio e connettere un debugger al processo in cui viene eseguito.To debug a service, you must start the service and then attach a debugger to the process in which it is running. È quindi possibile eseguire il debug dell'applicazione tramite tutte le funzionalità di debug standard di Visual Studio.You can then debug your application by using all of the standard debugging functionality of Visual Studio.

Attenzione

Non connettersi a un processo a meno che non si conoscano il tipo di processo e le conseguenze di tale operazione, che potrebbe anche terminare il processo.You should not attach to a process unless you know what the process is and understand the consequences of attaching to and possibly killing that process. Se ad esempio ci si connette al processo WinLogon e si interrompe il debug, il sistema si arresta in quanto non può funzionare senza WinLogon.For example, if you attach to the WinLogon process and then stop debugging, the system will halt because it can’t operate without WinLogon.

È possibile connettere il debugger solo a un servizio in esecuzione.You can attach the debugger only to a running service. Il processo di connessione interrompe il funzionamento corrente del servizio, in realtà non arresta né sospende l'elaborazione del servizio.The attachment process interrupts the current functioning of your service; it doesn’t actually stop or pause the service's processing. Ciò significa che se il servizio è in esecuzione quando inizia il debug, tecnicamente si trova ancora nello stato Avviato all'avvio del debug, ma l'elaborazione è sospesa.That is, if your service is running when you begin debugging, it is still technically in the Started state as you debug it, but its processing has been suspended.

Dopo aver effettuato la connessione al processo, sarà possibile impostare i punti di interruzione e usarli per eseguire il debug del codice.After attaching to the process, you can set breakpoints and use these to debug your code. Quando si chiude la finestra di dialogo usata per effettuare la connessione al processo, si entra in modalità di debug.Once you exit the dialog box you use to attach to the process, you are effectively in debug mode. È possibile usare Gestione controllo servizi per avviare, arrestare, sospendere e riprendere il servizio raggiungendo così i punti di interruzione impostati.You can use the Services Control Manager to start, stop, pause and continue your service, thus hitting the breakpoints you've set. Al termine del debug, è possibile rimuovere il servizio fittizio.You can later remove this dummy service after debugging is successful.

Questo articolo descrive il debug di un servizio in esecuzione nel computer locale, ma è possibile anche eseguire il debug di servizi Windows in esecuzione in un computer remoto.This article covers debugging a service that's running on the local computer, but you can also debug Windows Services that are running on a remote computer. Vedere Debug remoto.See Remote Debugging.

Nota

Il debug del metodo OnStart può risultare difficile in quanto Gestione controllo servizi impone un limite di 30 secondi per tutti i tentativi di avvio di un servizio.Debugging the OnStart method can be difficult because the Services Control Manager imposes a 30-second limit on all attempts to start a service. Per altre informazioni, vedere Risoluzione dei problemi: debug dei servizi Windows.For more information, see Troubleshooting: Debugging Windows Services.

Avviso

Per ottenere informazioni significative per il debug, il debugger di Visual Studio deve trovare il file di simboli per i file binari sottoposti a debug.To get meaningful information for debugging, the Visual Studio debugger needs to find symbol files for the binaries that are being debugged. Se si esegue il debug di un servizio compilato in Visual Studio, i file di simboli (con estensione PDB) si trovano nella stessa cartella dell'eseguibile o della libreria e il debugger li carica automaticamente.If you are debugging a service that you built in Visual Studio, the symbol files (.pdb files) are in the same folder as the executable or library, and the debugger loads them automatically. Se si esegue il debug di un servizio che non è stato compilato, è necessario prima trovare i simboli per il servizio e assicurarsi che possano essere individuati dal debugger.If you are debugging a service that you didn't build, you should first find symbols for the service and make sure they can be found by the debugger. Vedere Specificare file di simboli (con estensione pdb) e di origine nel debugger di Visual Studio.See Specify Symbol (.pdb) and Source Files in the Visual Studio Debugger. Se si esegue il debug di un processo di sistema o è necessario avere i simboli per le chiamate di sistema nei servizi, aggiungere i server dei simboli Microsoft.If you're debugging a system process or want to have symbols for system calls in your services, you should add the Microsoft Symbol Servers. Vedere Simboli di debug.See Debugging Symbols.

Per eseguire il debug di un servizioTo debug a service

  1. Compilare il servizio nella configurazione di debug.Build your service in the Debug configuration.

  2. Installare il servizio.Install your service. Per altre informazioni, vedere Procedura: Installare e disinstallare servizi.For more information, see How to: Install and Uninstall Services.

  3. Avviare il servizio da Gestione controllo servizi, da Esplora server o dal codice.Start your service, either from Services Control Manager, Server Explorer, or from code. Per altre informazioni, vedere Procedura: Avviare servizi.For more information, see How to: Start Services.

  4. Avviare Visual Studio con credenziali amministrative, in modo che sia possibile connettersi a processi di sistema.Start Visual Studio with administrative credentials so you can attach to system processes.

  5. (Facoltativo) Nella barra dei menu di Visual Studio scegliere Strumenti, Opzioni.(Optional) On the Visual Studio menu bar, choose Tools, Options. Nella finestra di dialogo Opzioni scegliere Debug, Simboli, selezionare la casella di controllo Server dei simboli Microsoft e quindi scegliere il pulsante OK.In the Options dialog box, choose Debugging, Symbols, select the Microsoft Symbol Servers check box, and then choose the OK button.

  6. Nella barra dei menu scegliere Connetti a processo dal menu Debug o Strumenti.On the menu bar, choose Attach to Process from the Debug or Tools menu. (Tastiera: CTRL+ALT+P)(Keyboard: Ctrl+Alt+P)

    Verrà visualizzata la finestra di dialogo Processi.The Processes dialog box appears.

  7. Selezionare la casella di controllo Mostra processi di tutti gli utenti.Select the Show processes from all users check box.

  8. Nella sezione Processi disponibili scegliere il processo per il servizio e quindi scegliere Connetti.In the Available Processes section, choose the process for your service, and then choose Attach.

    Suggerimento

    Il processo avrà lo stesso nome del file eseguibile del servizio.The process will have the same name as the executable file for your service.

    Verrà visualizzata la finestra di dialogo Connetti a processo .The Attach to Process dialog box appears.

  9. Scegliere le opzioni appropriate e quindi scegliere OK per chiudere la finestra di dialogo.Choose the appropriate options, and then choose OK to close the dialog box.

    Nota

    A questo punto si è in modalità di debug.You are now in debug mode.

  10. Impostare i punti di interruzione da usare nel codice.Set any breakpoints you want to use in your code.

  11. Accedere a Gestione controllo servizi e modificare il servizio, specificando i comandi per arrestare, sospendere e riprendere il servizio, in modo da raggiungere i punti di interruzione impostati.Access the Services Control Manager and manipulate your service, sending stop, pause, and continue commands to hit your breakpoints. Per altre informazioni sull'esecuzione di Gestione controllo servizi, vedere Procedura: Avviare servizi.For more information about running the Services Control Manager, see How to: Start Services. Vedere anche Risoluzione dei problemi: debug dei servizi Windows.Also, see Troubleshooting: Debugging Windows Services.

Suggerimenti per il debug dei servizi WindowsDebugging Tips for Windows Services

La connessione al processo di un servizio consente di eseguire il debug della maggior parte del codice del servizio, ma non di tutto.Attaching to the service's process allows you to debug most, but not all, the code for that service. Poiché, ad esempio, il servizio è già stato avviato, non è possibile eseguire il debug del codice nel metodo OnStart del servizio o del codice nel metodo Main usato per caricare il servizio.For example, because the service has already been started, you cannot debug the code in the service's OnStart method or the code in the Main method that is used to load the service this way. Un modo per aggirare questa limitazione consiste nel creare un secondo servizio temporaneo nell'applicazione di servizio che esiste solo per il debug.One way to work around this limitation is to create a temporary second service in your service application that exists only to aid in debugging. È possibile installare entrambi i servizi, quindi avviare il servizio fittizio per caricare il processo del servizio.You can install both services, and then start this dummy service to load the service process. Una volta che il servizio temporaneo ha avviato il processo, usare il menu Debug in Visual Studio per connettersi al processo del servizio.Once the temporary service has started the process, you can use the Debug menu in Visual Studio to attach to the service process.

Provare ad aggiungere le chiamate al metodo Sleep per ritardare l'azione finché non si è in grado di connettersi al processo.Try adding calls to the Sleep method to delay action until you’re able to attach to the process.

Provare a modificare il programma in un'applicazione console normale.Try changing the program to a regular console application. A tale scopo, riscrivere il metodo Main come segue in modo che possa essere eseguito come servizio Windows e come applicazione console, a seconda della modalità di avvio.To do this, rewrite the Main method as follows so it can run both as a Windows Service and as a console application, depending on how it's started.

Procedura: Eseguire un servizio Windows come applicazione consoleHow to: Run a Windows Service as a console application

  1. Aggiungere un metodo al servizio che esegue i metodi OnStart e OnStop:Add a method to your service that runs the OnStart and OnStop methods:

    internal void TestStartupAndStop(string[] args)  
    {  
        this.OnStart(args);  
        Console.ReadLine();  
        this.OnStop();  
    }  
    
  2. Riscrivere il metodo Main come segue:Rewrite the Main method as follows:

    static void Main(string[] args)  
    {  
        if (Environment.UserInteractive)  
        {  
            MyNewService service1 = new MyNewService(args);  
            service1.TestStartupAndStop(args);  
        }  
        else  
        {  
            // Put the body of your old Main method here.  
        }  
    }
    
  3. Nella scheda Applicazione delle proprietà del progetto impostare il Tipo di output su Applicazione console.In the Application tab of the project's properties, set the Output type to Console Application.

  4. Scegliere Avvia debug (F5).Choose Start Debugging (F5).

  5. Per eseguire nuovamente il programma come servizio Windows, installarlo e avviarlo come di consueto per un servizio Windows.To run the program as a Windows Service again, install it and start it as usual for a Windows Service. Non è necessario annullare queste modifiche.It's not necessary to reverse these changes.

In alcuni casi, ad esempio quando si vuole eseguire il debug di un problema che si verifica solo all'avvio del sistema, è necessario usare il debugger di Windows.In some cases, such as when you want to debug an issue that occurs only on system startup, you have to use the Windows debugger. Scaricare Windows Driver Kit (WDK) e vedere Esecuzione del debug dei servizi Windows.Download the Windows Driver Kit (WDK) and see How to debug Windows Services.

Vedere ancheSee also