2016-04-29 10 views
2

Wir haben einen Dienst geschrieben in C++ mit etwas Code in .NET via CLI. Aufgrund einer Drittanbieter-Bibliothek, die den Speicher auf einer datengesteuerten Basis überschreibt, waren wir gezwungen, den Hauptverarbeitungscode in einen separaten Codepfad zu strippen, der wie folgt verwendet wird. Wenn Sie die Service-EXE mit einem bestimmten Befehlszeilenparameter ausführen, können Sie den gesamten Service entweder als Konsolenanwendung ausführen, indem Sie die Serviceteile umgehen, oder als Konsolenanwendung, die nur die Verarbeitung durchführt. Im Hauptbetriebsmodus startet der Dienst normal und verwendet createprocess, um seine eigene ausführbare Datei mit einem Befehlszeilenparameter zu starten, der die Serviceinitialisierung überspringt und direkt zum Verarbeitungsteil geht. Der Dienstthread wartet dann darauf, dass der untergeordnete Prozess beendet wird, und wiederholt diesen Prozess nach Bedarf.Was kann dazu führen, dass ein Prozess nicht mehr neu erstellt wird?

Das Problem, das auftritt, ist, dass der Dienst die Befehlszeilenversion von sich nicht startet, nachdem 1700 unterordneten Prozess ausgeführt wird. Wenn wir Pech haben, weigert sich der Dienst auch, neu zu starten. Wenn der Dienst den Neustart verweigert, befinden sich keine relevanten Prozesse im Arbeitsspeicher. Wenn der Dienst im Befehlszeilenmodus ausgeführt wird, nachdem der Dienst fehlgeschlagen ist, wird er für weitere 1700 Läufe des untergeordneten Prozesses fortgesetzt, bis er ebenfalls fehlschlägt. Ein Systemneustart ist erforderlich, um das Funktionieren des Service-/Befehlszeilenprozesses wiederherzustellen. Wir erhalten auch Fehler 322 - "Das Zielgerät verfügt nicht über ausreichende Ressourcen, um den Vorgang abzuschließen." im Ereignisprotokoll. Wir haben bereits ein Job-Kernel-Objekt entfernt, das den untergeordneten Prozess und den übergeordneten Prozess in einer Einheit gruppiert, sodass das Kind auch beendet wird, wenn Sie das übergeordnete Element beenden. Dies erhöhte die Grenze von 1700 um mehrere Tausend.

Gibt es einen Grund, warum Windows sich erinnern würde, dass ein Prozess ausgeführt wurde und diesen Prozess bei der erneuten Ausführung bestrafen würde? Offensichtlich werden Prozesse, die unter verschiedenen Desktops ausgeführt werden, oder Benutzer als separate Prozesse in Bezug auf dieses Problem behandelt. Wenn der Dienst fehlschlägt, kann die Befehlszeilenversion ausgeführt werden und funktioniert eine Weile. Hat das etwas mit dem Desktop-Heap zu tun? Wir haben nie mehr als zwei Prozesse gleichzeitig im Speicher. Welche Art von Windows-Funktionen kann einen Prozess nachhaltig beeinflussen, wenn er das nächste Mal unter einem bestimmten Desktop/Benutzer ausgeführt wird?

+1

Ich hatte meinen Anteil mit Desktop Heap. Weitere Informationen finden Sie unter http://geekswithblogs.net/akraus1/archive/2014/02/04/155370.aspx. Sie können auch Desktop-Heap-zugeordnete Objekte löschen. Registerwindowmessage ist ein guter Anfang, um sich zu kümmern. –

Antwort

3

Klingt so, als würden Sie eine Kernel-Ressource verlieren, die zwischen dem übergeordneten Prozess und den untergeordneten Prozessen geteilt wird. Vielleicht erstellt der Elternteil bei jedem Start eines Kindprozesses einen Handle für eine Ressource und übergibt ihn (geteilt) an das Kind, wobei er erwartet, dass das Kind es schließt ... aber nicht selbst schließt, wie es nötig ist?

Die Dienstprogramme von SysInternals können Ihnen bei der Diagnose helfen. HandleEx oder Process Explorer zum Starten und dann mit Process Monitor einchecken.

+1

Desktop Heap zugewiesene Objekte wie Windows oder Windows-Nachrichtenregistrierungen sind für diese Tools normalerweise nicht sichtbar. Sie müssen einen Kernel-Debugger verwenden, um die aktuellen Desktop-Heaps zu überwachen, oder Sie injizieren einen Kernel-Treiber wie dheapmon tut http://blog.airesoft.co.uk/2009/10/desktop-heap-monitor-vista-7/ –

+0

@ AloisKraus: In diesem Kontext scheint es unwahrscheinlich, dass es sich um ein Desktop-Heap-Objekt handelt. Es gibt keinen Grund dafür, dass die Eltern Desktop-Heap-Objekte pro Kind erstellen, und alles, was das Kind erstellt, sollte wie üblich aufgeräumt werden. Noch eine Überprüfung wert, aber ich würde zuerst nach Kernel-Objekten suchen. –

Verwandte Themen