Backtraces, Stack‐Traces oder wie man diese Teile nun bezeichnet ist eigentlich egal – Um es auf den Punkt zu bringen, wir reden von Debugging und der Interprätation von Fehlern indem wir uns den Inhalt des Stacks eines Programmes ansehen.
Um dies zu bewerkstelligen benötigen wir eine Umstellung unseres Systems, da der GCC keine Debug‐Informationen in Binaries einbaut, da dies zu grösseren Binaries und somit oftmals zu einem Performance‐Verlust führt. Dieses Verhalten kann man jedoch mit den entsprechenden CFLAGS unseren Wünschen entsprechend verändern:
CFLAGS=”-march=pentium‑m ‑Os ‑ggdb”
Ich verwende zwar Gentoo‐Linux, aber wieso auf einmal keine grossen Optimierungen mehr? Das Optimieren von Binaries verändert sie dermassen, dass ein Debugger wie der gdb den Stack nicht mehr ablaufen kann und somit die Debug‐Info verloren geht. “-fomit‐frame‐pointer” ist desweiteren, nebst ‑O3 ein Flag welches den Debugger verwirrt.
Ach ja… und dann war da noch hardened‐ bzw SELinux und PIE – mit anderen Worten: Optimierungen – sowohl Geschwindigkeit als auch Sicherheit sind für Debugging‐Zwecke nicht vorgesehen.
Nachdem die CFLAGS geändert wurden gibt es noch ein paar Dinge, die man beachten sollte, wie z.B. dass Gentoo Linux Binaries stripped. Moment mal… Nackte Programme? Machen die auch Table‐Dance? – Da muss ich leider enttäuschen. Stripping heisst, dass Sektionen der Binaries, welche nicht zum Ausführen des Programms benötigt – dies betrifft auch unsere Debug‐Info – entfernt werden. Eine einfache Möglichkeit bietet das Hinzufügen von ‘nostrip’ zu den FEATURES der make.conf um diese zu behalten.
Der elegantere Weg jedoch ist das Feature ‘splitdebug’, welches die Debug‐Informationen in /usr/lib/debug ablegt, um sie getrennt von der Binary aufzubewahren. Dies passiert während des Strippens und wird bei ‘nostrip’ nicht durchgeführt.
Auf diesem Weg erhalten wir die Debug‐Info um sie einem entsprechenden Debugger wie dem gdb zur Verfügung zu stellen. Nun denn: Happy emerge ‑e world