Ü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