AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Kann mein Programm "merken" wo es sich aufgehängt hat?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Der schöne Günther · begonnen am 25. Jan 2016 · letzter Beitrag vom 27. Jan 2016
Antwort Antwort
Der schöne Günther

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

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

  Alt 25. Jan 2016, 07:56
Übermüdete Entwickler bauen manchmal while-Schleifen die unter bestimmten Umständen nie verlassen werden. Manchmal posten sie danach in der Delphi-Praxis.

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


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

Geändert von Der schöne Günther (25. Jan 2016 um 08:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 25. Jan 2016, 08:24
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Der schöne Günther

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

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

  Alt 25. Jan 2016, 08:32
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
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#4

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

  Alt 25. Jan 2016, 10:31
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.
Sebastian

Geändert von geskill (25. Jan 2016 um 10:54 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 25. Jan 2016, 10:52
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
Heiko
  Mit Zitat antworten Zitat
Der schöne Günther

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

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

  Alt 25. Jan 2016, 11:09
Warum? Die Geschwindigkeit sollte doch nicht niedriger sein, oder?
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

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

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

  Alt 27. Jan 2016, 00:22
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.
  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 23:46 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