AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?

Ein Thema von Der schöne Günther · begonnen am 18. Apr 2013 · letzter Beitrag vom 18. Apr 2013
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.155 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?

  Alt 18. Apr 2013, 14:00
Das ist eigentliche eine Frage, wie Ihr sie sicherlich schon 100 mal gehört habt. Ich bekomme es noch nicht einmal auf die Reihe, die Antwort zu finden.

Das einzige, was ich bislang gefunden habe, ist mittels GetExitCodeThread den Hauptthread des gestarteten Prozesses zu überprüfen. Entweder er liefert STILL_ACTIVE oder halt den Wert mit dem er sich beendet hat.

Aber das kann doch nicht schon alles sein? Ein paar Messages in den Raum werfen und irgendwie versuchen zu schauen, ob ein Fenster der Anwendung ihre Message Loop noch abholt?

Ich stehe auf dem Schlauch. Ich möchte im gleichen Thread, der den auch Prozess mittels CreateProcess selbst aufgemacht hat, später auch schauen können, wie es ihm geht. Und einfach nur zu wissen, ob der Hauptthread noch läuft kann sicher nicht schon alles sein.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?

  Alt 18. Apr 2013, 14:49
Warum willst du das wissen? Vlt kann man das Hauptproblem ja anders lösen.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.155 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?

  Alt 18. Apr 2013, 14:53
Der Benutzer startet den Prozess B über Prozess A (mein Programm) und Prozess B hat durchaus Wahrscheinlichkeiten, irgendwann auszusteigen. Freundlich beenden und notfalls rabiat abschießen ist alles kein Problem.

Ich möchte nur dem Benutzer auch sagen können "Lasset alle Hoffnung fahren, da rührt sich so schnell nichts mehr".


Hört sich schrecklich an, aber dass ich mit CreateProcess eine andere Anwendung starte, wissen will, wie es ihr geht und sie auch selbst wieder schließe - Daran ist nichts zu rütteln
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?

  Alt 18. Apr 2013, 14:58
Also nicht reagiert heißt nicht, dass das Programm abgestürtzt ist, von daher müsstest du höchstens das über Timeouts lösen.

Im Falle eines Absturzes würde ich die gestartete Anwendung einfach debuggen und kucken, ob es zu einer unbehandelten Exception im Prozess gekommen ist.. Falls ja, erwürgen!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (18. Apr 2013 um 15:04 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.155 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?

  Alt 18. Apr 2013, 15:02
Der Punkt ist nur, auf den gestarteten Prozess habe ich relativ wenig Einfluss, das ist mehr von einem Drittanbieter. Keine Ahnung, was der da ausliefert.

Also außer dem Prozess Messages zuwerfen und wenn ich hierauf nach einer Weile immer noch keine Antwort erhalten habe geht da nicht mehr viel?

Das mit dem Debuggen verstehe ich nicht - Kann ich herausfinden, was in einem vollkommen anderen Prozess für Exceptions vorkommen?
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?

  Alt 18. Apr 2013, 15:05
Ich befürchte das weiß oft Windows selbst nicht so recht, denn auch Programme, die im Taskmanager als "Anwendung reagiert nicht" stehen, leben oft doch noch. Das sind Anwendungen, die an einer Stelle beschäftigt sind, an der z.B. kein Processmessages eine Reaktion zulässt.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#7

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?

  Alt 18. Apr 2013, 15:13
Also erstmal: Du kannst nicht herausfinden ob ein Prozess nur lange braucht oder sich aufgehangen hat.

Was du aber machen kannst, ist ein Protokoll definieren (mit Timeouts, usw.) und wenn sich der Prozess nicht entsprechend diesem Protokoll verhält, gilt er als aufgehangen. Bevor du also prüfen kannst, ob ein Prozess "gesund" ist, musst du erstmal festlegen, was ein "gesunder" Prozess ist. Das kann dir niemand wirklich abnehmen.

Ich befürchte das weiß oft Windows selbst nicht so recht, denn auch Programme, die im Taskmanager als "Anwendung reagiert nicht" stehen, leben oft doch noch. Das sind Anwendungen, die an einer Stelle beschäftigt sind, an der z.B. kein Processmessages eine Reaktion zulässt.
Das wäre eine Beispiel für so ein Protokoll. Der Taskmanager verwendet vermutlich MSDN-Library durchsuchenIsHungAppWindow [StackOverflow].

Je nach Anwendung könntest du z.B. auch prüfen, ob es mindestens ein sichtbares Fenster gibt.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?

  Alt 18. Apr 2013, 15:13
Reagiert nicht bedeutet nur, dass das GetMessage/PeekMessage nicht ordentlich aufgerufen wird - dh die Anwendung rechnet gerade intensive, weshalb es dazu nicht kommt - Windows interpretiert das so, dass die Anwendung sich aufgehangen hat.

Du kannst aber, wenn du weißt, dass nach 5 Sek. zB die Anwendung normalerweise fertig sein sollte, ein Timeout mit 10 sek setzen dann einfach terminieren.
WaitForSingleObject() mit 10*1000 MSec zB

Das mit dem Debugger - schau dir die Parameter bei CreateProcess an - "DEBUG_ONLY_THIS_PROCESS"

Anschließend, per WaitForDebugEvent() Loop die Debug-Events abholen und kucken. Da interessiert dich "EXCEPTION_DEBUG_EVENT" (wobei die erste Exception ein Sonderfall ist und einfach zu ignorieren ist)
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (18. Apr 2013 um 15:16 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.155 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Wie finde ich heraus, ob ein Prozess sich aufgehangen hat?

  Alt 18. Apr 2013, 15:32
Hallo-

Vielen Dank. Das IsHungAppWindow war mir bekannt, ich hatte es nur schnell wieder wegen dem
Zitat:
[This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.]
verdrängt.

Im Endeffekt möchte ich hier auch kein professionelles System ausarbeiten - Wenn der Windows Task-Manager das (fälschlicherweise) meint, dann kann ich das dauch meinen. Das reicht mir


Aber vielen Dank für die Debug-Sache, das werde ich mir bei Gelegenheit einmal genauer ansehen...

Geändert von Der schöne Günther (18. Apr 2013 um 15:44 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz