(glibc) Backtrace pointers in (file, function, line)

05/07/2012 - 13:55 von ole-usenet-spam | Report spam
Hallo Gruppe,

ich habe innerhalb meines Programmes einen "backtrace()" [1] erzeugt und
möchte den gerne am Schluss des Programmes in übersichtlicher Form
pràsentieren, also mit Quelldateiname, Zeilennummer und Funktionsname
(jeweils soweit als Debuggingsymbol vorhanden).

Gibt es dafür innerhalb des GNU-Universums eine geeignete Bibliothek mit
Funktion, die mir das erledigt? Hintergrund ist, dass in einer von mir
verwendeten Bibliothek eine private Fehlerverwaltung eingebaut ist und
ich die gerne erweitern möchte, sodass sie mir den Aufrufstack anzeigen
kann, wenn ein Fehler auftrat.

Die unter [1] als backtrace_symbols() angebotene Funktion leistet das
leider nicht, da sie die Debuggingsymbole nicht auswertet.

OS: Linux

Viele Grüße

Ole

[1] http://www.gnu.org/software/libc/ma...races.html
 

Lesen sie die antworten

#1 Jan Seiffert
05/07/2012 - 16:50 | Warnen spam
Olе Streicher schrieb:
Hallo Gruppe,

ich habe innerhalb meines Programmes einen "backtrace()" [1] erzeugt und
möchte den gerne am Schluss des Programmes in übersichtlicher Form
pràsentieren, also mit Quelldateiname, Zeilennummer und Funktionsname
(jeweils soweit als Debuggingsymbol vorhanden).

Gibt es dafür innerhalb des GNU-Universums eine geeignete Bibliothek mit
Funktion, die mir das erledigt? Hintergrund ist, dass in einer von mir
verwendeten Bibliothek eine private Fehlerverwaltung eingebaut ist und
ich die gerne erweitern möchte, sodass sie mir den Aufrufstack anzeigen
kann, wenn ein Fehler auftrat.

Die unter [1] als backtrace_symbols() angebotene Funktion leistet das
leider nicht, da sie die Debuggingsymbole nicht auswertet.




Hast du den Text ganz gelesen? Ich zitiere:
"Also, you may need to pass additional flags to the linker to make the function
names available to the program. (For example, on systems using GNU ld, you must
pass (-rdynamic.)"

Diese Funktionen arbeiten meiner Erfahrung nach nicht mit debugging kram (-g), sondern
einfach was ELF Symboltabellen und unwind info bereit stellt (scheitert deshalb
AFAIR auch an den Grenzen eines Sighandlers, also du kannst nicht aus dem sighandler
eines SIGSEGV z.B. unwinden). Darum muss man seine CFLAGS und LDFLAGS reichlich
garnieren mit allen möglichen esoterischen Flags die die Symboltabellen "more
verbose" machen.

Vielleicht gibt es da mittlerweile was libartiges (KDE macht das mittlerweile
für gecrashte KDE Progs, Ubuntu benutzt irgend so einen Reporting Daemon wie
man ihn unter Windows kennt), aber general Wisdom ist, das es da nix gibt.

Der meist benutzte Trick ist an sich selbst einen Debugger hàngen, der ein bt
ausführt.
Das ist nur so dreckig, das will man nicht in production Code, obwohl
es da am meisten hilft...

OS: Linux

Viele Grüße

Ole




Gruss
Jan

Ähnliche fragen