Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kann mein Programm "merken" wo es sich aufgehängt hat? (https://www.delphipraxis.net/188021-kann-mein-programm-merken-wo-es-sich-aufgehaengt-hat.html)

Der schöne Günther 25. Jan 2016 07:56


Kann mein Programm "merken" wo es sich aufgehängt hat?
 
Übermüdete Entwickler bauen manchmal while-Schleifen die unter bestimmten Umständen nie verlassen werden. Manchmal posten sie danach in der Delphi-Praxis. :duck:

Exceptions kann man ja super loggen und kann genau sagen "In Zeile XY knallt es weil ...". Wenn allerdings die Anwendung (bevorzugt im Hauptthread) hängt kann der Kunde nur ungläubig auf den Bildschirm starren und irgendwann den Stecker ziehen.

Meine Frage: Geht das besser? Außer weniger schlecht programmieren?


Speziell festzustellen ob der Hauptthread hängt sollte kein Problem sein. Meine Frage wäre nur: Wie komme ich an den Stack? Im Debugger kann ich einfach sagen "Verbinde mit Prozess", halte die Anwendung an, und schaue wo er grade hängt. Wie würde man das in einer laufenden Anwendung machen? Kurz anhalten, irgendwie die Aufrufreihenfolge feststellen, loggen, weitermachen.


// Update

Alles klar, langsam werde ich wach. War doch einfacher als gedacht :oops:


Delphi-Quellcode:
uses JclDebug;

procedure TForm3.Button2Click(Sender: TObject);
var
   infoList: TJclStackInfoList;
   strings: TStrings;
begin
   infoList := JclDebug.JclCreateThreadStackTrace(True, myThread.Handle);
   strings := TStringList.Create();
   try
      infoList.AddToStrings(strings);
      Memo1.Lines.Assign(strings);
   finally
      strings.Destroy();
   end;
end;
So zumindest kann ich den Stack eines anderen Threads auslesen. Wird von einem "Watchdog"-Thread welcher den Stack des Hauptthreads auslesen möchte wohl genauso funktionieren :-)

jaenicke 25. Jan 2016 08:24

AW: Kann mein Programm "merken" wo es sich aufgehängt hat?
 
Oder man nimmt Eurekalog und aktiviert die Erkennung einer hängenden Anwendung, sprich des Hauptthreads. Dann bekommst du automatisch nach der eingestellten Zeit einen sauberen Bugreport inkl. Stacktraces aller Threads usw.

Der schöne Günther 25. Jan 2016 08:32

AW: Kann mein Programm "merken" wo es sich aufgehängt hat?
 
OT: Ich bin niemand der glaubt das Rad zum 5. mal neu erfinden zu müssen, aber manche Sachen mache ich lieber selber als einen fremden Automatismus davor zuschalten. Das gehört dazu- Irgendwie wäre mir so etwas unsympathisch.

Aber danke für den Hinweis dass Eurekalog das bereits out of the box kann :-)

geskill 25. Jan 2016 10:31

AW: Kann mein Programm "merken" wo es sich aufgehängt hat?
 
Durch statische Code Anaylse kann man diesen Fehler ggf. aufspüren und vermeiden.

Ansonsten bau dir drei Funktionen die vor, im und nach dem Schleifendurchlauf aufgerufen werden (hier Log Messages oder Stacktrace erstellen). Dies fügst du dann in alle Schleifen ein. Dann nimm Reguläre Ausdrücke und füge dies in dein gesamtes Projekt ein.

hoika 25. Jan 2016 10:52

AW: Kann mein Programm "merken" wo es sich aufgehängt hat?
 
Hallo,
also ich benutze MadExcept, das ist sowas ähnliches wie Eurokalog.
Dabei habe ich allerdings immer eine Nicht-MadExcept-Version und eine MadExcept-Version.
Die MadExcept-Version wird nur dann gestartet, wenn es Probleme mit der Nicht-MadExcept-Version gibt.

Heiko

Der schöne Günther 25. Jan 2016 11:09

AW: Kann mein Programm "merken" wo es sich aufgehängt hat?
 
Warum? Die Geschwindigkeit sollte doch nicht niedriger sein, oder?

BUG 27. Jan 2016 00:22

AW: Kann mein Programm "merken" wo es sich aufgehängt hat?
 
Zitat:

Zitat von geskill (Beitrag 1328086)
Durch statische Code Anaylse kann man diesen Fehler ggf. aufspüren und vermeiden.

Im Allgemeinen leider nicht (Halteproblem) :)

Theoretisch kann man mit Timeouts viel machen, praktisch geht das schwer mit der Ressourcenverwaltung. Wenn du fehleranfällige Programmteile in eigenen Prozessen ausführst, kannst du viel an Kontrolle gewinnen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 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