Dies ist eine alte Version des Dokuments!


GDB

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:

  • Programm mit Optionen starten
  • Programm bei bestimmten Bedingungen anhalten
  • Untersuchen was geschehen ist, wenn das Programm angehalten wurde
  • Inhalt des Speichers ändern

Handhabung

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

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

Remote Debugging

GDB Remote Debugging

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.

Beispiel mit MPC5200

Grundsätzlicher Aufbau

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.

Java Code

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);
}

Assembler Code

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

Assembler Code mit STABS

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