Selbstgebauter Stacktrace
-
Ich bin mit mir selbst gerade uneins, ob ich einen selbst geschriebenen Stacktrace verwenden sollte.
In jede Funktion müsste ich am Anfang nur schreiben:
void foo() { AUTOTRACE // do something }
und danach wird automagisch bei signalen oder auf Anfrage ein mutlitthreaded fake stacktrace erstellt, der ungefähr so aussieht:
(Pseudo trace)
thread id 0: ~/somewhere/main.cpp (line 8) main ~/somewhere/something.cpp (line 47) foo thread id 1: ~/somewhere/mythread.cpp (line 175) loop
Hintergrund: Eine clientanwendung schmiert erst viele Stunden nach der Ausführung ab. Und mir geht das momentan ziemlich auf den Zeiger. Damit wüsste ich wo der Fehler ist.
Andererseits gruselt mich der Gedanke das überall hinschreiben zu müssen.
(nicht wegen der Arbeit, die es macht, sonder optisch. Zumindest ist es ein Makro, dass man umdefininieren kann, wenn man will)
Wie seht ihr das?(Ich habe automatische Alternativen auf Stackoverflow gesehen, aber die waren mir zu mager)
-
Wenn du unter Linux entwickelst, dann bietet sich folgendes an: backtrace in Kombination mit addr2line.
http://linux.die.net/man/3/backtrace
http://www.linuxcommand.org/man_pages/addr2line1.htmlMit backtrace ermittelst du die Addressen der momentan aktiven Funktionen. Diese fütterst du dann an addr2line und bekommst eine Ausgabe, wie du es dir wünschst. So musst du deine Funktionen nicht anrühren!
Hier ein kleines Beispiel dazu: http://blog.hartwork.org/?p=1359 Du kannst alle Möglichen Signale zu Beginn registrieren. In dem Beispiel fehlt leider das addr2line. Irgendwo auf meinem Heimrechner müsste ich ein einfaches Beispiel dazu haben, aber da komme ich gerade nicht so einfach ran. Google spuckt bestimmt noch einiges dazu aus.