Manchmal ist es wichtig zu analysieren, was während des Starts des Dienstes vor sich geht. Das Anhängen an den Prozess hilft hier nicht weiter, da Sie nicht schnell genug sind, um den Debugger anzuhängen, während der Dienst gestartet wird.
Die kurze Antwort lautet: Ich verwende dazu die folgenden 4 Codezeilen :
#if DEBUG
base.RequestAdditionalTime(600000); // 600*1000ms = 10 minutes timeout
Debugger.Launch(); // launch and attach debugger
#endif
Diese werden OnStart
wie folgt in die Dienstmethode eingefügt :
protected override void OnStart(string[] args)
{
#if DEBUG
base.RequestAdditionalTime(600000); // 10 minutes timeout for startup
Debugger.Launch(); // launch and attach debugger
#endif
MyInitOnstart(); // my individual initialization code for the service
// allow the base class to perform any work it needs to do
base.OnStart(args);
}
Für diejenigen, die es noch nicht getan haben, habe ich unten detaillierte Hinweise beigefügt , da Sie leicht stecken bleiben können. Die folgenden Hinweise beziehen sich auf Windows 7x64 und Visual Studio 2010 Team Edition , sollten jedoch auch für andere Umgebungen gültig sein.
Wichtig: Stellen Sie den Dienst im "manuellen" ModusInstallUtil
bereit (verwenden Sie entweder das Dienstprogramm an der VS-Eingabeaufforderung oder führen Sie ein von Ihnen vorbereitetes Dienstinstallationsprojekt aus). Öffnen Sie Visual Studio, bevor Sie den Dienst starten, und laden Sie die Lösung mit dem Quellcode des Dienstes. Richten Sie zusätzliche Haltepunkte nach Bedarf in Visual Studio ein. Starten Sie den Dienst dann über die Dienststeuerung.
Aufgrund des Debugger.Launch
Codes wird das Dialogfeld "In Servicename.exe ist eine nicht behandelte Microsoft .NET Framework-Ausnahme aufgetreten ." erscheinen. Klicken Sie wie im Screenshot gezeigt: Yes, debug Servicename.exe
Insbesondere in Windows 7 UAC werden Sie anschließend möglicherweise aufgefordert, Administratoranmeldeinformationen einzugeben. Geben Sie sie ein und fahren Sie fort mit Yes:
Danach wird das bekannte Just-In-Time-Debugger-Fenster von Visual Studio angezeigt. Sie werden gefragt, ob Sie mit dem ausgewählten Debugger debuggen möchten. Bevor Sie auf klicken Yes, wählen Sie aus , dass Sie keine neue Instanz öffnen möchten (2. Option). Eine neue Instanz wäre hier nicht hilfreich, da der Quellcode nicht angezeigt wird. Sie wählen stattdessen die zuvor geöffnete Visual Studio-Instanz aus:
Nachdem Sie geklickt haben Yes, zeigt Visual Studio nach einer Weile den gelben Pfeil rechts in der Zeile an, in der sich die Debugger.Launch
Anweisung befindet, und Sie können Ihren Code debuggen (Methode MyInitOnStart
, die Ihre Initialisierung enthält).
Durch Drücken von wird F5die Ausführung sofort fortgesetzt, bis der nächste von Ihnen vorbereitete Haltepunkt erreicht ist.
Tipp: Um den Dienst am Laufen zu halten, wählen Sie Debug -> Alle trennen . Auf diese Weise können Sie einen Client ausführen, der mit dem Dienst kommuniziert, nachdem dieser ordnungsgemäß gestartet wurde und Sie das Debuggen des Startcodes abgeschlossen haben. Wenn Sie Shift+F5 drücken (Debugging beenden), wird der Dienst beendet. Stattdessen sollten Sie das Service Control Panel verwenden , um es zu stoppen.
Beachten Sie das
Wenn Sie ein Release erstellen , wird der Debug-Code automatisch entfernt und der Dienst wird normal ausgeführt.
Ich verwende Debugger.Launch()
, der einen Debugger startet und anfügt . Ich habe auch getestet Debugger.Break()
, was nicht funktioniert hat , da beim Start des Dienstes noch kein Debugger angeschlossen ist (was den "Fehler 1067: Der Prozess wurde unerwartet beendet" verursacht ).
RequestAdditionalTime
setzt eine längere Timeout für die Inbetriebnahme des Service (es ist nicht selbst zu verzögern den Code, sondern wird sofort mit der weiterhin Debugger.Launch
Anweisung). Andernfalls ist das Standardzeitlimit zum Starten des Dienstes zu kurz und das Starten des Dienstes schlägt fehl, wenn Sie nicht base.Onstart(args)
schnell genug vom Debugger aus anrufen . Bei einer Zeitüberschreitung von 10 Minuten wird praktisch vermieden, dass die Meldung " Der Dienst hat nicht geantwortet ..." unmittelbar nach dem Start des Debuggers angezeigt wird.
Sobald Sie sich daran gewöhnt haben, ist diese Methode sehr einfach, da Sie lediglich 4 Zeilen zu einem vorhandenen Service-Code hinzufügen müssen, damit Sie schnell die Kontrolle und das Debuggen erlangen können.