Feststellen, ob Programm hängt.



  • Ich möchte feststellen ob sich ein Programm aufgehängt hat, oder ob es noch "lebt". Dazu könnte ich an ein Fenster des Programms eine Nachricht mit "SendMessageCallback" schicken oder sowas in der Art. Aber was mache ich, wenn das Programm gar keine Fenster hat?



  • Ja, das ist der "klassische" Ansatz für die Lösung (den auch der Task-Manager verwendet) - du schickst eine Nachricht an das Programm und wenn es nach einer vorgegebenen Zeit nicht darauf antwortet, ist es "tot". Das Problem dürfte dabei sein herauszufinden, wohin du diese Nachricht schicken kannst.

    (Randfrage: gehört das überwachte Programm dir? Sprich: Kannst du im Programm etwas ändern?)



  • Hmm ich glaube nicht das dies so eifnach möglich ist da es von Programm zu Programm ja unterschiedlich ist. Wie definierst du denn "ein Programm hängt"?
    Ein Programm kann ja ne stunde "schlafen", "wacht" dann auf, tut sein dienst und legt sich wieder für ne stunde "schlafen". Wie willst du sowas erkennen?
    Darf man den Hintergrund erfahren, wozu?

    [Edit] das bezieht sich natürlich auf Programme ohne Fenster und Nachrichtenschleife. Bei Fenstern mit Nachrichtenschleife ist ein ähnliches Problem was ja CStoll erläutert hat. [/Edit]
    schirrmie



  • Ich habe die Process-ID des Programms, damit komme ich auch an die Fenster - Handles dran. Meine Idee ist folgende: Wird z.B. der Browser durch einen Exploit kompromittiert, dann hängt er sich erstmal auf weil der Exploit seinen Stack kaputtmacht (der Exploitcode läuft natürlich weiter). Das könnte man für eine Firewall ausnützen: Hat sich das Programm das eine Verbindung ins Internet aufbauen will (was die meisten Exploits tun) aufgehängt, besteht kein Grund ihm den Zugang zum Internet zu gewähren. Liege ich falsch?


  • Mod

    Ja du liegst falsch. Auch der IE verwendet mehrere Threads. Wenn der Exploit den Workerthread attakiert, dann läuft der GUI Thread weiter und dann?

    Die GUI reagiert und den Worker kannst Du nicht kontrollieren.



  • *ausgegraben*

    Ich möchte auch wissen ob ein Programm hängt oder läuft, meins hat aber ein Fenster also müsste doch SendMessageCallback() gehen oder? Dazu meine Frage.
    Laut MSDN brauche ich 6 Argumente. HWND ist klar. Aber wie müssen die restlichen Argumente aussehen?


  • Mod

    Was willst Du mit SendMessageCallBack.
    SendMessageTimeout ist weitauis besser geeignet.
    http://msdn.microsoft.com/en-us/library/ms644952(VS.85).aspx

    Du könntest einfach WM_NULL nehmen und diese senden. wParam und LPaam einfach auf 0 lassen. Wird die Nachricht beantwortet läuft die Nachrichtenschleife zumindest noch.



  • Ah Danke! Läuft super.


Anmelden zum Antworten