Wie ich das gelöst habe:
Bei jedem Aufruf einer Funktion wird der aktuelle ProgramCounter (PC) in
einer Liste gespeichert. Die Liste ist 20 Elemente groß und so sehe ich
maximal 20 letzte Funktionsaufrufe.
Ich nutze einen STM32. Wenn nun da z.B. eine Hard-Fault Exception kommt,
so wird alles gesperrt und per serieller Debug-Schnittstelle diese Liste
ausgegeben. Nun kann ich im MAP File nachschauen welche
Programm-Funktionen da aufgerufen werden und so den Fehler einkreisen.
Klappt ganz gut und hat mir schon einige Stunden Fehlersuche erspart.
Bei C++ mit Objekten müsste man vermutlich nicht nur die Speicheradresse
sonder vielleicht besser der Name der Funktion in die Liste speichern.
Beim PC (in Pascal) mache ich es so, dass bei jedem Funktionsaufruf der
Funktionsname mittels ADD() in eine TStringList gespeichert wird und
wenn die Funktion verlassen wird mittels DELETE() das letzte Element
wieder gelöscht wird. Somit ist in der Liste die ganze Aufrufhierarchie
gespeichert.
Kommt nun eine Exception in der Applikation so wird ein globaler
Errorhandler aufgerufen und diese Liste in das Log geschrieben.
Ist ebenfalls super einfach und man kann genau nachvollziehen was
passierte.
Beide Möglichkeiten müssen natürlich extra programmiert werden,
benötigen Rechenleistung und beim zweiten darf niemals ein DELETE()
vergessen werden (z.B. bei einem Return vor dem Ende), sonst überläuft
die Liste.
Die zweite Variante habe ich hier drin:
Beitrag "EleLa - Elektronik Lagerverwaltung ab V2.0"
Und ich kann jederzeit einem User helfen, da mir das Log den Fehler
immer mit der entsprechenden Programmposition zeigt.