Wikipedia · einfach zusammengefasst · Stand
Debugsymbol
Als Debugsymbole werden in der Informatik Informationen bezeichnet, die zum Debuggen von ausführbaren Dateien erstellt werden können.
Inhalt5 Abschnitte
Definition und Bedeutung
Debugsymbole sind zusätzliche Informationen für das Debuggen ausführbarer Dateien. Sie stammen vor allem aus dem Quelltext und bewahren Bezeichner wie Variablennamen sowie Namen von Prozeduren und Funktionen. Dadurch helfen sie, Fehler im kompilierten Programm auf der Ebene der ursprünglichen Programmiersprache zu untersuchen.
Problem beim Kompilieren
Beim Übersetzen von Quelltext in Maschinencode oder Bytecode gehen Bezeichner und teilweise auch die ursprüngliche Programmstruktur verloren. Bezeichner werden für die Ausführung nicht benötigt und würden zusätzlichen Speicher belegen. Optimierungen können die Struktur außerdem stark verändern: Beim „loop unrolling“ werden Schleifen umgeformt, um beispielsweise bedingte Sprünge zu vermeiden und die Befehlspipeline moderner Prozessoren zu nutzen. Bei der Vektorisierung werden wiederholte gleichartige Operationen auf einem Array durch andere Konstrukte ersetzt, um SIMD-Fähigkeiten zu verwenden.
Ohne zusätzliche Informationen beschränkt sich das Debuggen ausführbarer Dateien und Dynamic-Link Libraries (DLLs) auf Maschinencode-Ebene im Wesentlichen auf Assemblerbefehle sowie den aktuellen Verarbeitungsstand, etwa Maschinenregister, Programmzähler und tabellarisch dargestellte Speicherbereiche. Dadurch ist der Programmablauf bei einem Fehler oft schwer nachzuvollziehen; außerdem sind besondere Kenntnisse der Rechnerarchitektur und Assemblersprache erforderlich.
Funktionsweise der Debugsymbole
Der Entwickler kann den Compiler anweisen, beim Übersetzen zusätzliche Symbolinformationen in das Programm einzubinden. Der Begriff „Symbol“ bedeutet hier Bezeichner. Meist verzichtet der Compiler dann auf umfangreichere Optimierungen. Ein symbolischer Debugger kann damit das Programmgeschehen auf Quellsprachenebene verfolgen.
Zu den Debuginformationen gehört insbesondere die Symboltabelle. Sie enthält und verwaltet Angaben über definierte oder referenzierte Funktionen und globale Variablen und ordnet deren symbolische Namen den jeweiligen Maschinenadressen zu. Der Debugger kann zudem Ausdrücke der Quellsprache auswerten, indem beispielsweise Quellcode mit dem zugehörigen, von der Rechnerarchitektur abhängigen Assemblercode abgeglichen wird.
Nachteile
Da die Informationen häufig bereits beim Übersetzen in den Maschinencode eingebunden werden, werden die ausführbaren Dateien erheblich größer. Für die endgültige Programmversion entfernt man die Debugsymbole deshalb meist wieder oder speichert sie in einer separaten Datei.
Symboltabellen erleichtern nach einer Dekompilierung außerdem die Gewinnung eines deutlich verständlicheren Quelltexts. Das ist besonders für Unternehmen problematisch, deren Quelltext ein Firmengeheimnis bleiben soll; als Gegenmaßnahme wird Obfuskation genannt. Weil der Compiler bei Debugversionen im Allgemeinen die meisten Optimierungen unterlässt, kann zudem die Ausführungsgeschwindigkeit deutlich sinken.
Bereitstellung in kommerzieller Software
Einige Unternehmen stellen Debugsymbole für ihre Programme getrennt bereit, damit Fehler untersucht werden können. Diese Dateien lassen sich separat herunterladen. Beispielsweise kann Microsofts Debugger WinDbg Debugsymbole für Windows-DLLs automatisch herunterladen, wenn der Quellcode nicht verfügbar ist.