Technischer Überblick
Wenn ein Linux-Prozess unerwartet mit einem Speicherzugriffsfehler (Segmentation Fault) abbricht oder einen Core Dump erzeugt, liefern Logdateien und Registerauszüge meist nur rohe Hexadezimaladressen. Ohne Verknüpfung zur Codebasis gestaltet sich die Ursachenforschung mühsam. An dieser Stelle kommt das Dienstprogramm addr2line aus dem GNU-Werkzeugkasten ins Spiel: Es schlägt die Brücke von Maschinencode-Adressen zu konkreten Quelldateien und exakten Zeilennummern. Dieses Praxistutorial demonstriert den gesamten Debugging-Workflow – vom Kompilieren mit DWARF-Symbolinformationen (-g) über das Demangling von C++-Bezeichnern (-C) bis hin zur Rückverfolgung von Inline-Funktionsaufrufen (-i).
1. Bereitstellung der Kernwerkzeuge (binutils und gcc) sowie Funktionsprüfung
Zur Ausführung von addr2line und zur Übersetzung unserer Beispielprogramme werden die GNU Binary Utilities sowie der GCC-Compiler benötigt. Die Installation auf einem Ubuntu-System erfolgt über folgenden Befehl:

Nach Abschluss der Paketinstallation lässt sich die Verfügbarkeit und Version des Werkzeugs mit addr2line -v verifizieren:
Das Tool dient primär dazu, bei Prozessabstürzen und Segfaults gemeldete Speicherpositionen automatisiert in lesbare Dateipfade und Codezeilen zu übersetzen.
⚙️ [Die wichtigsten Parameter im Überblick]
-e : Bestimmt den Pfad zur Binärdatei bzw. zum Executable, das analysiert werden soll.-f : Gibt neben der Quellcode-Zeile auch den zugehörigen Funktionsnamen aus.-C : Dekodiert compilerspezifisch gemangelte C++-Symbole in eine lesbare Funktionssignatur.-p : Formatiert Dateinamen, Zeilennummer und Funktion übersichtlich in einer einzelnen Zeile.-a : Zeigt die übergebene Hexadezimaladresse direkt vor dem Analyseergebnis an.-i : Löst verschachtelte Aufrufstrukturen bei Inline-Funktionen schrittweise auf.

2. Erstellung und Kompilierung einer Testanwendung mit Debug-Symbolen (-g)
Um die Tests in einer isolierten Umgebung durchzuführen, erstellen wir ein dediziertes Verzeichnis und wechseln direkt hinein:

Anschließend generieren wir eine C-Quelldatei namens test_crash.c, die eine separate Funktion faulty_function definiert, um spätere Call-Stacks nachzustellen:

Damit addr2line später auf die erforderlichen Tabellen zugreifen kann, kompilieren wir das Programm mit dem Schalter -g. Über -O0 werden Optimierungen bewusst abgeschaltet, um Compiler-Verschiebungen im Code zu unterbinden:

Über das Tool nm inspizieren wir die Symboltabelle der erzeugten Binärdatei und lokalisieren die virtuelle Startadresse der Zielfunktion:
Aus dem Terminal-Output geht hervor, dass faulty_function an der Adresse 0000000000001149 hinterlegt ist.

3. Quellcode-Zeilen und Funktionsnamen aus Speicheradressen auflösen (-e, -f)
Um die ermittelte Speicheradresse flexibel wiederzuverwenden, legen wir den Hex-Wert in einer Umgebungsvariablen ab:

Mittels -e verweisen wir auf das Executable und übergeben die Variable. Das Werkzeug ordnet den Wert unmittelbar der Quelldatei und Zeile zu (test_crash.c:3):

Wird der Parameter -f ergänzt, blendet addr2line vor der Positionsangabe zusätzlich den Namen der verantwortlichen Funktion (faulty_function) ein:

4. Fortgeschrittene C++-Crash-Analyse: Demangling (-C) und Inline-Tracing (-i, -p)
Für die Behandlung komplexerer C++-Binärdateien installieren wir zunächst den G++-Compiler:

Nun schreiben wir ein C++-Programm (test_cpp.cpp), das ein typisches Inlining-Szenario nachbildet: Die main-Funktion ruft process() auf, welche ihrerseits die Funktion deep_inline() einbettet:

Wir kompilieren den Code mit aktiviertem Debugging (-g), schalten jedoch mit -O2 eine höhere Optimierungsstufe ein, um die Inline-Expansion des Compilers gezielt zu provozieren:

Aus der generierten ELF-Binärdatei extrahieren wir die Einsprungadresse der Funktion main und speichern diese in MAIN_ADDR:

Durch die Kombination von -C (Demangling), -i (Inline-Auflösung) und -p (einzeiliges Format) lässt sich der Aufrufpfad präzise darstellen.
Sollte dabei die Ausgabe ??:0 erscheinen, weist dies darauf hin, dass durch aggressive Optimierungen oder Adressverschiebungen von Position Independent Executables (PIE) kein direkter statischer Zeilenbezug hergestellt werden konnte:

Mit addr2line steht unter Linux ein mächtiges Diagnosewerkzeug bereit, um unklare Fehlermeldungen und Adress-Dumps ohne langwieriges Raten auf den verursachenden Code zurückzuführen. Sobald Sie bei der nächsten Fehlersuche mit Segfault-Logs konfrontiert werden, lässt sich der Zeitaufwand für die Lokalisierung des Defekts damit auf ein Minimum reduzieren.