![]() |
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:
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 :-)
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; |
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.
|
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 :-) |
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. |
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 |
AW: Kann mein Programm "merken" wo es sich aufgehängt hat?
Warum? Die Geschwindigkeit sollte doch nicht niedriger sein, oder?
|
AW: Kann mein Programm "merken" wo es sich aufgehängt hat?
Zitat:
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 12:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz