it-swarm.com.de

Was führt dazu, dass StartServiceCtrlDispatcher () mit 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) fehlschlägt?

Bei meinem Windows-Dienstprogramm wird ein seltsamer Fehler angezeigt. Mein Service-Programm ruft StartServiceCtrlDispatcher() am Anfang seiner main() auf, aber es schlägt manchmal mit 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) fehl.

Ich weiß, dass dieser Fehler auftritt, wenn der Benutzer das Programm manuell startet (als Konsolenprogramm). Aber das ist nicht der Fall. Ich habe einen Code hinzugefügt, um den übergeordneten Prozess des Dienstprogramms zu überprüfen, wenn dieser Fehler auftritt, und er besagt, dass services.exe der übergeordnete Prozess ist (ich denke, es ist sicher anzunehmen, dass mein Programm ordnungsgemäß von SCM gestartet wurde).

Leider wird dieser Fehler nicht auf meinem Entwicklungscomputer reproduziert und kann nicht von mir selbst behoben werden.

  • Dieses Problem scheint nur bei wenigen% aller Benutzer dieses Programms aufzutreten.
  • Selbst wenn das Problem auftritt, scheint es sich nicht zu wiederholen. Das nächste Mal wird der Dienst normalerweise erfolgreich gestartet.
  • Wenn dieses Problem auftritt, bleibt StartServiceCtrlDispatcher() etwa eine Sekunde lang stehen, bevor es mit einem Fehler zurückkehrt.

Hat jemand einen ähnlichen Fehler gesehen? Wenn ja, was war die Ursache des Fehlers?

11
Susumu Arai

Wie Sie bereits aus dem Fehlen von Antworten und von irgendetwas bei Google erkennen können, ist das Problem nicht alltäglich. Ich glaube, das Problem liegt in Ihrem Service UND wird in Code ausgeführt, der vom Prozess bis zu StartServiceCtrlDispatcher() ausgeführt wird, und höchstwahrscheinlich in irgendeiner Form beschädigte Systemressourcen, wahrscheinlich Heap oder HANDLE.

Es tut dir leid, das zu hören, aber ich werde keine magische Antwort auf deine Probleme haben. Stattdessen kann ich eine Problembehandlung vorschlagen.

Microsoft Application Verifier ist von unschätzbarem Wert bei der Suche nach Korruption. Ich schlage vor, dass Sie:

  1. Installieren Sie es auf Ihrem Entwicklungscomputer.
  2. Fügen Sie dem Dienst Ihren Dienst hinzu.
  3. Wählen Sie erst Basics\Heaps zum ersten Mal aus.
  4. Drücken Sie Speichern. Es spielt keine Rolle, wenn Sie die Anwendungsüberprüfung geöffnet lassen.
  5. Führen Sie Ihren Dienst einige Male aus.
  6. Wenn es abstürzt, debuggen Sie es und der Absturz weist auf Ihr Problem hin.
  7. Wenn es nicht abstürzt, fügen Sie Basics\Handles hinzu. Im Gegensatz zu Basics\Heaps kann dies manchmal "falsch positive" auslösen - Fehler im Code, die nicht viel schaden. Wie auch immer, da Sie auf der Jagd sind, sollten Sie besser alles reparieren, was Sie finden können. Ich mache mir hauptsächlich Sorgen, ob ich eine HANDLE oder so etwas doppelt befreien könnte. Ein versehentliches Freigeben eines Servicemanagers HANDLE kann sicherlich zu Ihrem Problem führen.
  8. Wenn es immer noch nicht abstürzt, können Sie andere Optionen in Basics\* ausprobieren, aber ich denke nicht, dass dies helfen wird.
  9. An dieser Stelle möchten Sie möglicherweise den Code zwischen main() und StartServiceCtrlDispatcher() des Programms und den möglichen globalen Konstruktoren überprüfen. Suchen Sie mit HANDLE nach potenziellen Pufferüberläufen und Fehlern.
  10. Der nächste Schritt könnte die Installation von Application Verifier auf dem Client-Computer sein. Es ist nicht viel Schaden, ich tue es manchmal, wenn ich den Fehler nicht selbst finden kann.
7
Codeguard

TIPP: Ich habe _wfopen/fwrite/fclose verwendet, um einige Nachrichten zu protokollieren. Irgendwie wurde 183 intern geworfen und führte zu diesem Fehler 1063. Ich entfernte die Protokollierung und es begann normal zu arbeiten, da nichts passiert. Jeder Fehler kann dazu führen. Starten Sie vom Dienst und es wird der Lohnfehler angezeigt (in meinem Fall 183).

0
hidalgo