Einzelnen Beitrag anzeigen

Der schöne Günther

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

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

  Alt 25. Jan 2016, 08: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 09:16 Uhr)
  Mit Zitat antworten Zitat