Funktionsweise eines Debugger
-
Hallo, ich beschäftige mich im Rahmen meines Praktikums gerade mit der genauen Funktionsweise eines Debugger. Ich bin auch auf der Suche nach genauen Informationen über Debugging Symbolen.
Es wäre nett wenn ihr Links für Dokumentationen oder ähnliches schicken könnt oder einfach ein paar Sätze über die genaue Funktionsweise eines Debuggers schreiben könnt.
Vielen Dank!!
-
Dir geht es also darum wie der Debugger ein oder mehrere Assembler-Statements auf eine Quellcode-Zeile in einer Hochsprache abbildet?
-
Ja unter anderem. Mich interessiert die Abbildung auf Hochsprache. Mich interessiert aber auch die Allgemeine Vorgehensweise beim Debuggen (welche Informationen sind notwendig, wie ist die genaue Abfolge beim debuggen etc...)
-
Was genau sind debugging Symbole, welchen Einfluss haben sie, wie werden debugging Symbole in das Programm (bzw. den Quelltext) eingefügt.
-
Ok, da kann ich dir weiterhelfen um eine Adresse aus einer ausführbaren Datei auf eine Quellcode-Zeile abzubilden gibt es ein Tool in den binutils: addr2line. Das kannst du dir einmal anschauen.
Was "Debugging Symbols" angeht, da könntest du mal nach "debugging symbols gcc" suchen bzw. gdb.
-
j0hannes schrieb:
Hallo, ich beschäftige mich im Rahmen meines Praktikums gerade mit der genauen Funktionsweise eines Debugger. Ich bin auch auf der Suche nach genauen Informationen über Debugging Symbolen.
Es wäre nett wenn ihr Links für Dokumentationen oder ähnliches schicken könnt oder einfach ein paar Sätze über die genaue Funktionsweise eines Debuggers schreiben könnt.naja, erstmal muss ein debugger fähig sein, einzelne maschinencode-anweisungen auszuführen. das ist ziemlich architekturabhängig und kann schwierig werden, wenn die CPU keine hardware-breakpoints bzw. single-step modi hat. dann muss er die maschinencodes disassemblieren, registerinhalte anzeigen können und das ist schon mal das wichtigste. zum source-level debugging brauchste von compiler/linker erzeugte debug-infos entweder im binary selber oder in separaten dateien. die debug-infos enthalten eine zuordnung von quelltext zum maschinencode, z.b. namen von funktionen, variablen, deren adressen usw. damit hat der debugger alle informationen zusammen und du kannst fröhlich durch den quelltext steppen.
-
Debugger gibt es ganz unterschiedliche. Highleveldebugger (wie man sie zB von Visual C++ kennt oder den GDB), die die Debugsymbole aus dem Binary nehmen. Die Debugsymbole fallen je nach Platform und Compiler auch relativ unterschiedlich aus. Das kann der ganze Quellcode sein, mit Verweisen auf die einzelnen Maschinencodeblöcken oder nur eine Zuordnung von Funktionsnamen auf Sprungadressen. Wenn dich das näher interessiert, könntest du dir zB das verbreitete DWARF-Format anschauen. Ansonsten gibt es noch Lowleveldebugger, die ganz ohne Debugsymbole auskommen können (SoftIce oder RR0D oder teilweise auch der GDB). Lowleveldebugger sind vor allem nützlich, wenn man Software reverse engineeren will oder Treiber debuggen.
Für Breakepoints werden entweder Hardwarebreakepoints benutzt (über bestimmte CPU Register) oder in dem der Code der Anwendung geändert wird und entsprechende Signale (bei x86 CPUs ist dasint $0x03
) in den Code eingefügt werden. Ansonsten bieten gerade Embedded-CPUs auch noch Hardwareschnittstellen an denen man Systemzustände auslesen kann (=> JTAG)