5 Stimmen

Windows Service Prozess kann nicht angehängt werden

Ich habe einen sehr einfachen Windows-Dienst, der in vb.net 2008 entwickelt wird. Wenn ich versuche, es zu debuggen, indem ich zu Tools-> Attach to process gehe, obwohl ich meinen Dienst sehe, ist er deaktiviert und Typ von Managed und ich kann den Prozess nicht auswählen.

Wie kann ich meinen Dienst debuggen?

Danke

0 Stimmen

Ich habe meine Antwort auf Ihre Frage hin aktualisiert.

15voto

Wenn Sie dem "Tutorial" zur Erstellung von Windows-Diensten in MSDN folgen, werden Sie auf dieses Problem stoßen. Sie werden MyNewService.vshost.exe im Dialogfeld "An Prozess anhängen" sehen, aber es wird deaktiviert sein. Um Ihren Dienst zu sehen, müssen Sie BEIDE Optionen "Prozesse von allen Benutzern anzeigen" UND "Prozesse in allen Sitzungen anzeigen" aktivieren, um Ihren Dienst zu sehen. Der Dienst läuft unter dem Benutzernamen "SYSTEM", wenn Sie die Anweisungen im Tutorial befolgt haben, und Dienste laufen normalerweise in einer anderen Sitzung.

Wenn Sie beide Kästchen markieren (und die Datei MyNewService.vshost.exe ignorieren), wird MyNewService.exe angezeigt, die Sie auswählen und debuggen können.

Natürlich wird nichts passieren, bis der Dienst auf einen Haltepunkt trifft. Sie können den OnPause-Handler (wie den OnContinue-Handler) erstellen, aber um Ihren Dienst anhalten zu können, müssen Sie das CanPauseAndContinue-Flag für Ihren Dienst setzen (das gleiche Objekt wie das AutoLog-Flag).

Bei meinen Tests auf meinem 64-Bit-Rechner führte auch die Neukompilierung des Projekts nicht zu einem erfolgreichen Debugging. Selbst das Kompilieren und Neuinstallieren funktionierte nicht. Ich musste das Projekt neu kompilieren, dann das Setup-Projekt neu kompilieren und dann das Setup neu installieren, um den Dienst debuggen zu können.

Schließlich kann das Ereignisprotokoll über die Ereignisanzeige unter Verwaltung in der Systemsteuerung eingesehen werden. Das "MyNewLog" befindet sich unter "Applications and Services Logs", wenn es wie im MSDN-Tutorial beschrieben erstellt wurde.

0 Stimmen

"Sobald Sie diese beiden Kästchen ankreuzen (und die MyNewService.vshost.exe ignorieren), sehen Sie MyNewService.exe" - das hat mir wirklich den Tag gerettet!

10voto

Matt Davis Punkte 44077

Anbindung an den Dienst sollte funktionieren, also weiß ich nicht, warum Sie das nicht können. Fügen Sie stattdessen die folgende Zeile in den Anwendungseinstiegspunkt für Ihren Windows-Dienst (oder die OnStart()-Methode) ein, kompilieren Sie im Debug-Modus und starten Sie den Dienst.

System.Diagnostics.Debugger.Break();

Wenn Sie den Dienst starten, werden Sie aufgefordert, den Prozess zu debuggen. Wählen Sie den Visual Studio 2008-Debugger, und der Prozess wird geladen und an Ihrem programmatischen Haltepunkt angehalten. Drücken Sie F5, um die Ausführung erneut zu starten.

EDIT:

Nehmen wir an, Sie haben den Dienst erstellt (Release-Modus oder Debug-Modus - das spielt keine Rolle) und installutil verwendet, um den Dienst zu installieren, aber Sie haben ihn noch nicht gestartet. Solange der Dienst pas laufen, können Sie weiterhin Codeänderungen vornehmen und neu kompilieren. Wenn Sie den Dienst starten, wird Ihr Dienst Ihre letzten Codeänderungen widerspiegeln. Wenn der Dienst es ausgeführt wird, können Sie den Dienst nicht vollständig kompilieren, da die Exe/Dll(s) in Gebrauch sind und nicht ersetzt werden können. Natürlich können Sie den Dienst einfach anhalten, neu kompilieren und dann neu starten. Der Punkt ist folgender: Sie müssen den Dienst nicht deinstallieren, um den Code zu ändern. Halten Sie es einfach an, ändern Sie den Code, kompilieren Sie neu und starten Sie es erneut.

Was das Debuggen im Debug-Modus im Vergleich zum Release-Modus betrifft, so weiß ich nicht, ob das der Grund ist, warum man sich nicht an den Prozess anhängen kann. Ich weiß, dass es möglich ist, Release-Versionen zu debuggen, aber ich würde das nicht empfehlen, einfach weil man bei aktivierten Optimierungen auf Probleme beim Durchlaufen des Codes stoßen kann. Wir haben das Debugging im Versionsmodus nur als letzten Ausweg benutzt.

Wenn Sie eine Visual Studio-Anwendung im Debug-Modus erstellen, wird sie standardmäßig in eine bin \Debug Unterverzeichnis Ihres Projekts. Wenn Sie im Release-Modus bauen, wird die ausführbare Datei in ein bin \Release Unterverzeichnis. Wenn Sie installutil verwenden, um Ihren Dienst zu installieren, ist das Einzige, was zählt, der Ort, an dem sich der Dienst befindet. In Ihrem Fall würde ich vorschlagen, die Release-Mode-Version Ihres Dienstes zu deinstallieren ( installutil /u c:\myapp\myapp\bin\release\myapp.exe ), den programmatischen Haltepunkt setzen, die Debug-Version erstellen und dann installutil verwenden, um die Debug-Version zu installieren (aus dem bin \Debug Verzeichnis).

Tut mir leid, dass das so langatmig war. Ich hoffe, das ist klar.

0 Stimmen

Danke Matt. Ich habe eine Frage. Hier ist, was ich tat. Ich baue die Anwendung im Release-Modus. ging zu installieren util und installierte es mit etwas wie installutil c: \myapp\myapp\bin\release\myapp.exe Meinen Sie, ich hätte es im Debug-Modus bauen und dann installutil c verwenden sollen: \myapp\myapp\bin\debug\myapp.exe und dann versuchen, sich dem Prozess anzuschließen?

0 Stimmen

Ja, Sie sollten im Debug-Modus bauen und aus der Bin-Datei installieren \debug Ordner.

3voto

Randy Levy Punkte 22402

Sind Sie sicher, dass Sie sich Ihren tatsächlichen Zustellungsprozess ansehen? Überprüfen Sie den Namen des Dienstes - ist es etwas wie servicename.vshost.exe? Wenn ja, handelt es sich nicht um Ihren Dienst, sondern um einen Visual Studio-Hosting-Prozess, der (unter anderem) für das F5-Debugging verwendet wird.

Um Ihren Dienst zu debuggen, aktivieren Sie das Kontrollkästchen "Prozesse von allen Benutzern anzeigen". Sie sollten den eigentlichen Dienstprozess, servicename.exe, in der Prozessliste sehen. Wenn er sichtbar ist, verbinden Sie sich einfach mit diesem Prozess.

0 Stimmen

Ja, Tuzo, ich sehe nur servicename.vshost.exe und nicht die vshost.exe. Wo liegt Ihrer Meinung nach das Problem?

0 Stimmen

Ignorieren Sie alle Prozesse, die vshost.exe enthalten, da Sie diese nicht debuggen können. Haben Sie die Option "Prozesse von allen Benutzern anzeigen" aktiviert? Wenn ja, sollten Sie Ihren Dienstprozess als servicename.exe sehen. Wenn dies nicht der Fall ist, bedeutet dies wahrscheinlich, dass Ihr Dienst nicht gestartet ist. Versuchen Sie, den Dienst zu starten.

1voto

Flea Punkte 10932

Ich musste nicht nur auswählen show processes from all users und die show processes in all sessions Kontrollkästchen; ich musste auch auf die Select und wählen Sie dann die Schaltfläche Managed Code.

enter image description here

0voto

Michael Mann Punkte 757

Ein Dienst ist nichts anderes als eine Konsolenanwendung, so dass Sie in der Lage sein sollten, die Exe von der Befehlszeile auszuführen, solange sie im Debug-Modus kompiliert wurde. Sobald der Prozess von der Kommandozeile aus läuft, gehen Sie zu Debug => attach to process in Visual Studio und verbinden Sie sich mit der Exe, die Sie gerade von der Kommandozeile aus gestartet haben. Sie können den Prozess auch direkt in der Visual Studio IDE mit F5 starten.

Wenn Ihr Dienst unter einem speziellen Benutzerkonto läuft, müssen Sie den Befehl runas /user verwenden, um entweder Visual Studio zu starten, wenn Sie in Visual Studio debuggen, oder von der Befehlszeile aus, wenn Sie ihn von der Befehlszeile aus ausführen.

Wenn dies nicht funktioniert.... Sie mir Bescheid.

Mit freundlichen Grüßen, Michael

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X