Dieser Artikel oder nachfolgende Abschnitt ist nicht hinreichend mit
Belegen
(beispielsweise
Einzelnachweisen
) ausgestattet. Angaben ohne ausreichenden Beleg konnten demnachst entfernt werden. Bitte hilf Wikipedia, indem du die Angaben recherchierst und
gute Belege einfugst.
Als
Debugsymbole
werden in der
Informatik
Informationen bezeichnet, die zum
Debuggen
von ausfuhrbaren Dateien erstellt werden konnen. Diese konnen direkt aus dem
Quelltext
gewonnen werden, insbesondere
Bezeichner
, z. B.?Variablennamen, Namen von Prozeduren und Funktionen o. A.
Beim
Kompilieren
des Quelltextes eines Programms in den
Maschinencode
oder
Bytecode
gehen Bezeichner, teilweise sogar die ursprungliche Programmstruktur, verloren (z. B.
loop unrolling
). Bezeichner werden im kompilierten Programm nicht mehr benotigt und wurden daher unnotig Speicher belegen. Die Programmstruktur wird von vielen Compilern beim Optimierungsvorgang verandert (
loop unrolling,
um bspw.?
bedingte Sprunge
zu vermeiden und die
Befehlspipeline
von modernen Prozessoren zu nutzen) oder gar aufgelost und durch andere Konstrukte ersetzt (z. B.
Vektorisierung
von wiederholten, gleichartigen Operationen auf einem Array, um
SIMD
-Fahigkeiten zu nutzen). Wenn der Compiler also Schleifen im Programmcode durch Maschinenbefehle ersetzt, welche iterierte Instruktionen (also hintereinander ausgefuhrte Befehle) zu einer einzelnen Maschinenspracheninstruktion zusammenfassen, wird eine Fehlersuche im Programmfluss schwierig oder gar unmoglich (vgl.
Black Box
).
Die Moglichkeiten des Debuggens von ausfuhrbaren Dateien und
Dynamic-Link Libraries
(DLLs) auf
Maschinencode
-Ebene beschranken sich dann im Wesentlichen auf die Ausgabe der zugehorigen
Assemblerbefehle
sowie des aktuellen Verarbeitungsstands (
Maschinenregister
,
Programmzahler
, Datenbereiche des Speichers in tabellarischer Form).
Somit ist meist schwer, den Ablauf eines Programms bei einem Fehler nachzuvollziehen. Auch mussen spezielle Kenntnisse uber die
Rechnerarchitektur
und
Assemblersprache
vorhanden sein.
Aus diesem Grunde kann der Entwickler den
Compiler
beim Ubersetzen des Programms anweisen, in die Maschinensprache zusatzliche Informationen uber das Programm einzubinden, die das Debuggen eines Programms erleichtern und als
Debugsymbole
oder
Symbolinformationen
bezeichnet werden. Meist unterlasst der Compiler daraufhin umfangreichere Optimierungen. Der Begriff Symbol wird in diesem Zusammenhang im Sinne von
Bezeichner
verwendet. Anschließend kann mittels eines symbolischen Debuggers das Programmgeschehen auf Quellsprachenebene der
Programmiersprache
verfolgt werden.
Solche Debuginformationen umfassen unter anderem die
Symboltabelle
, welche Informationen uber Funktionen und globale Variablen, die im Programm definiert bzw. referenziert sind, enthalt und verwaltet (Zuordnung zwischen symbolischen Namen und Maschinenadressen). Außerdem lassen sich Ausdrucke in der Quellsprache durch den Debugger auswerten, indem zum Beispiel ein Matching zwischen Quellcode und korrespondierendem architekturabhangigen Assemblercode erzeugt wird.
Da die Informationen meist schon beim Ubersetzen des Programms in Maschinensprache miteingebunden werden, sind die resultierenden ausfuhrbaren Dateien erheblich großer. Sie werden in der finalen Version eines Programms wieder entfernt oder konnen als separate Datei abgespeichert werden.
Außerdem ermoglichen diese Symboltabellen, nach einem Dekompilieren einen sehr viel leichter verstandlichen ruckgewonnenen Quelltext zu erhalten. Dies stellt insbesondere fur Firmen einen Nachteil dar, deren Quelltext ihrer Software ein Firmengeheimnis bleiben soll (siehe
Obfuskation
).
Da der Compiler im Allgemeinen die meisten Optimierungen unterlasst, wird die Ausfuhrungsgeschwindigkeit mitunter deutlich herabgesetzt.
Einige Unternehmen stellen zum Zwecke der Fehlersuche in ihren Programmen separate Debugsymbole fur ihre Dateien bereit, die auch separat heruntergeladen werden konnen.
Microsofts
Debugger
WinDbg
ist zum Beispiel in der Lage, Debugsymbole fur Windows-DLLs automatisch herunterzuladen, sofern der Quellcode nicht verfugbar ist.