Dies ist eine alte Version des Dokuments!
QuickLinks
Der GNU Debugger erlaubt es, zu sehen, was in einem Programm während der Ausführung passiert oder was ein Programm zuletzt gemacht vor einem Absturz.
Die vier Hauptfunktionen von GDB sind:
GDB ist in vielen IDEs (wie z.B. Eclipse) integriert und wird über das GUI bedient. Alternativ kann GDB auch über die Kommandozeile gestartet werden:
gdb executable_name
Programm starten:
run arg1 arg2 arg3
Programm beenden:
kill
GDB beenden:
quit
Alle GDB Befehle können mit der GDB-Hilfefunktion aufgelistet werden:
help
STABS (symbol tables) ist das Format in welchem das Program für den Debugger beschrieben wird. Der GCC Compiler kompiliert C-Programme (.c) in Assembler-Programme (.s), welche vom Assembler in Objekt-Dateien (.o) kompiliert werden, die dann vom Linker und anderen Objekt-Dateien zu einem ausführbarem Programm verlinkt werden.
Mit der Option '-g' des GCC Compilers wird in die .s-Dateien zusätzliche Information eingefügt. Diese Information beschreibt Eigenschaften der Source-Datei, wie z.B. Zeilennummern, Typen, Scope der Variable, Funktionsnamen, usw.
Beispiel: C Source, ASM Source mit STAB
GDB kann auch Programme debuggen, die nicht lokal ausgeführt werden. Auf dem Target muss aber ein RSP-Server lauften, der mit dem GDB kommunizieren kann. Die Kommunikation läuft über das Remote Serial Protokoll.
In der Zukunft sollte der Deep-Compiler zwei Files generieren. Das Image-File, welches direkt auf den MPC5200 geladen und ausgeführt wird, und ein ELF-File, welches zusammen mit den Java-Sourcen vom GDB Debugger benutzt werden können, um den MPC5200 zu debuggen.
Im ELF-File stehen die Debug-Information (STABS), die es GDB erlauben das Java-Program zu debuggen. In einer ersten Version werden die STABS manuell in ein Assembler-Programm eingefügt und mit dem GCC-Assembler übersetzt.
Um das Beispiel noch zu vereinfachen wird eine Endlos-Schleife ans Ende der reset()-Methode eingefügt:
static void reset() { int stackOffset = US.GET4(sysTabBaseAddr + stStackOffset); int stackBase = US.GET4(sysTabBaseAddr + stackOffset + 4); int stackSize = US.GET4(sysTabBaseAddr + stackOffset + 8); US.PUTGPR(1, stackBase + stackSize - 4); // set stack pointer int kernelClinitAddr = US.GET4(sysTabBaseAddr + stKernelClinitAddr); US.PUTSPR(SRR0, kernelClinitAddr); US.PUTSPR(SRR1, SRR1init); //US.ASM("rfi"); int x = 4; x ^= 0x55; US.PUTGPR(R27, x); while (true); }
Der Assembler-Code (test.S) sieht wie folgt aus:
.org 0x400100 reset: li r2, 16388 lwz r4, 0(r2) addi r2, r4, 16384 addi r3, r2, 4 lwz r5, 0(r3) addi r2, r4, 16384 addi r3, r2, 8 lwz r4, 0(r3) add r2, r5, r4 addi r3, r2, -4 mr r1, r3 li r2, 16396 lwz r4, 0(r2) mr r0, r4 mtspr SRR0, r0 li r2, 14338 mr r0, r2 mtspr SRR1, r0 li r2, 4 xori r3, r2, 0x55 xoris r3, r3, 0x0 mr r27, r2 b 0
Kompiliert wird mit folgendem Befehl:
$ powerpc-linux-gnu-as -mppc32 -mregnames -be test.S
Das ELF-File a.out wird erstellt. Dieses File kann durch folgenden Befehl disassembliert werden:
$ powerpc-linux-gnu-objdump -d -EB -G -mpowerpc a.out
Der Assembler-Code (test.S) mit den Debug-Informationen sieht wie folgt aus:
.include "stabs.include" .data .org 0x100000 .stabs "targetCommand:G2",N_GSYM,0,0,0 .global targetCommand targetCommand: .int 0 .org 0x400100 .stabs "/home/abajric/ntb/deep/ws/runtime-library/",N_SO,0,0,Ltext0 .stabs "src/ch/ntb/inf/deep/runtime/mpc555/Reset.java",N_SO,0,0,Ltext0 .text Ltext0: .stabs "void:t1=1",N_LSYM,0,0,0 .stabs "int:t2=r2;-2147483648;2147483647;",128,0,0,0 reset: .stabn N_SLINE, 0, 38, LM1 LM1: li r2, 16388 lwz r4, 0(r2) addi r2, r4, 16384 addi r3, r2, 4 lwz r5, 0(r3) addi r2, r4, 16384 addi r3, r2, 8 lwz r4, 0(r3) add r2, r5, r4 addi r3, r2, -4 .stabn N_SLINE, 0, 41, LM5 LM6: mr r1, r3 li r2, 16396 lwz r4, 0(r2) mr r0, r4 mtspr SRR0, r0 li r2, 14338 mr r0, r2 mtspr SRR1, r0 .stabn N_SLINE, 0, 47, LM4 LM4: li r2, 4 .stabs "x:r2;-2147483648;2147483647;",N_RSYM,0,4,2 .stabn N_SLINE, 0, 48, LM5 LM5: xori r3, r2, 0x55 .stabs "x:r2;-2147483648;2147483647;",N_RSYM,0,4,3 xoris r3, r3, 0x0 .stabn N_SLINE, 0, 50, LM2 LM2: mr r27, r2 .stabs "x:r2;-2147483648;2147483647;",N_RSYM,0,4,27 .stabn N_SLINE, 0, 51, LM3 LM3: b 0 .stabs "ch::ntb::inf::deep::runtime::mpc555::Reset::reset:F1",N_FUN,0,0,reset .stabn N_SLINE, 0, 37, reset .stabn N_LBRAC, 0, 0, LM1 .stabn N_RBRAC, 0, 0, LM3