Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Letzte ÜberarbeitungBeide Seiten der Revision
software:gdb:start [2016-02-17 12:28] abajricsoftware:gdb:start [2019-03-11 11:51] graf
Zeile 6: Zeile 6:
   * [[https://sourceware.org/gdb/download/onlinedocs/stabs/ | STABS]]   * [[https://sourceware.org/gdb/download/onlinedocs/stabs/ | STABS]]
 </box> </box>
 +===== Hauptfunktionen des 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. 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.
  
Zeile 14: Zeile 14:
   * Untersuchen was geschehen ist, wenn das Programm angehalten wurde   * Untersuchen was geschehen ist, wenn das Programm angehalten wurde
   * Inhalt des Speichers ändern   * Inhalt des Speichers ändern
 +
  
 ===== Handhabung ===== ===== Handhabung =====
-GDB ist in vielen [[http://de.wikipedia.org/wiki/Integrierte_Entwicklungsumgebung|IDE]]s (wie z.B. Eclipse) integriert und wird über das GUI bedient. Alternativ kann GDB auch über die Kommandozeile gestartet werden: +GDB ist in vielen [[http://de.wikipedia.org/wiki/Integrierte_Entwicklungsumgebung|IDE]]s (wie z.B. Eclipse) integriert und wird über das GUI bedient. Alternativ kann GDB auch über die Kommandozeile gestartet werden. 
- +Das ist besonders nütztlich, um einen Segfault zu überprüfen.
-''gdb executable_name'' +
- +
-Programm starten: +
- +
-''run arg1 arg2 arg3'' +
- +
-Programm beenden: +
- +
-''kill''+
  
-GDB beenden:+Mehr dazu unter im [[software:gdb:crashcoursegdb|Crashcourse gdb]]
  
-''quit'' 
  
-Alle GDB Befehle können mit der GDB-Hilfefunktion aufgelistet werden:+===== Coredumps ===== 
 +Mit Coredumps können Segfaults analysiert werden, ohne dass die Applikation im //gdb// gestartet wird. 
 +Ein //Backtrace// kann im Nachhinen untersucht werden. 
 +Es ist ebenfalls möglich, lokale Variablen nach dem Absturz zu untersuchen.
  
-''help''+Mehr dazu unter unter [[software:gdb:coredump|software:gdb:coredump]].
  
  
Zeile 141: Zeile 135:
 <code> <code>
 .include "stabs.include" .include "stabs.include"
 +
 +.stabs "void:t1=1",N_LSYM,0,0,0
 +.stabs "int:t2=r2;-2147483648;2147483647;",N_LSYM,0,0,0
  
 .data .data
Zeile 154: Zeile 151:
 .text .text
 Ltext0: Ltext0:
- 
-.stabs "void:t1=1",N_LSYM,0,0,0 
-.stabs "int:t2=r2;-2147483648;2147483647;",128,0,0,0 
  
 reset: reset:
Zeile 202: Zeile 196:
 .stabn N_LBRAC, 0, 0, LM1 .stabn N_LBRAC, 0, 0, LM1
 .stabn N_RBRAC, 0, 0, LM3 .stabn N_RBRAC, 0, 0, LM3
 +</code>
 +
 +Im File //stabs.include// stehen Definitionen der STABS Symboltypen:
 +
 +<code>
 +# non-stab symbol types
 +.set N_UNDF, 0x0
 +.set N_EXT, 0x1
 +.set N_ABS, 0x2
 +.set N_TEXT, 0x4
 +.set N_DATA, 0x6
 +.set N_BSS, 0x8
 +.set N_FN_SEQ, 0x0c
 +.set N_INDR, 0x0a
 +.set N_COMM, 0x12
 +.set N_SETA, 0x14
 +.set N_SETT, 0x16
 +.set N_SETD, 0x18
 +.set N_SETB, 0x1a
 +.set N_SETV, 0x1c
 +.set N_WARNING, 0x1e
 +.set N_FN, 0x1f
 +
 +# stab symbol types
 +.set N_GSYM, 0x20
 +.set N_FNAME, 0x22
 +.set N_FUN, 0x24
 +.set N_STSYM, 0x26
 +.set N_LCSYM, 0x28
 +.set N_MAIN, 0x2a
 +.set N_ROSYM, 0x2c
 +.set N_PC, 0x30
 +.set N_NSYMS, 0x32
 +.set N_NOMAP, 0x34
 +.set N_MAC_DEFINE, 0x36
 +.set N_OBJ, 0x38
 +.set N_MAC_UNDEF, 0x3a
 +.set N_OPT, 0x3c
 +.set N_RSYM, 0x40
 +.set N_M2C, 0x42
 +.set N_SLINE, 0x44
 +.set N_DSLINE, 0x46
 +.set N_BSLINE, 0x48
 +.set N_BROWS, 0x48
 +.set N_DEFD, 0x4a
 +.set N_FLINE, 0x4c
 +.set N_EHDECL, 0x50
 +.set N_MOD2, 0x50
 +.set N_CATCH, 0x54
 +.set N_SSYM, 0x60
 +.set N_ENDM, 0x62
 +.set N_SO, 0x64
 +.set N_LSYM, 0x80
 +.set N_BINCL, 0x82
 +.set N_SOL, 0x84
 +.set N_PSYM, 0xa0
 +.set N_EINCL, 0xa2
 +.set N_ENTRY, 0xa4
 +.set N_LBRAC, 0xc0
 +.set N_EXCL, 0xc2
 +.set N_SCOPE, 0xc4
 +.set N_RBRAC, 0xe0
 +.set N_BCOMM, 0xe2
 +.set N_ECOMM, 0xe4
 +.set N_ECOML, 0xe8
 +.set N_WITH, 0xea
 +.set N_NBTEXT, 0xf0
 +.set N_NBDATA, 0xf2
 +.set N_NBBSS, 0xf4
 +.set N_NBSTS, 0xf6
 +.set N_NBLCS, 0xf8
 +</code>
 +
 +
 +==== Beschreibung der STABS ====
 +
 +Online Doku von GDB:
 +  * [[https://sourceware.org/gdb/current/onlinedocs/gdb/| GDB User Manual]]
 +  * [[https://www.sourceware.org/gdb/onlinedocs/stabs.html| STABS Doku]]
 +  * [[https://sourceware.org/gdb/onlinedocs/stabs/Stab-Symbol-Types.html#Stab-Symbol-Types| STABS Symboltypen]]
 +
 +=== Definition von Typen ===
 +([[https://www.sourceware.org/gdb/onlinedocs/stabs.html#String-Field|String-Field]])
 +Type 1 = void und Type 2 = int.
 +
 +<code>
 +.stabs "void:t1=1",N_LSYM,0,0,0
 +.stabs "int:t2=r2;-2147483648;2147483647;",N_LSYM,0,0,0
 +</code>
 +
 +=== Definition von globalen Variablen ===
 +
 +([[https://www.sourceware.org/gdb/onlinedocs/stabs.html#Global-Variables|Global Variables]])
 +Variable targetCommand an Adresse 0x100000 vom Type 2 = int.
 +
 +<code>
 +.data
 +.org 0x100000
 +.stabs "targetCommand:G2",N_GSYM,0,0,0
 +.global targetCommand
 +targetCommand:
 +.int 0
 +</code>
 +
 +=== Definition vom Java-Sourcecode ===
 +
 +([[https://www.sourceware.org/gdb/onlinedocs/stabs.html#Source-Files|Source Files]])
 +Der erste STABS mit N_SO ist der Build-Ordner. Der Zweite ist der relative Pfad zum Source-File.
 +
 +<code>
 +.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:
 +</code>
 +
 +=== Definition von Zeilennummern ===
 +
 +([[https://www.sourceware.org/gdb/onlinedocs/stabs.html#Line-Numbers|Line Numbers]])
 +
 +<code>
 +reset:
 +.stabn N_SLINE, 0, 38, LM1
 +LM1:
 +
 +...
 +
 +.stabn N_SLINE, 0, 41, LM5
 +LM6:
 +
 +...
 +
 +.stabn N_SLINE, 0, 47, LM4
 +LM4:
 +</code>
 +
 +
 +
 +=== Definition von Registervariablen ===
 +([[https://www.sourceware.org/gdb/onlinedocs/stabs.html#Register-Variables|Register Variables]])
 +Registervariablen müssen immer im gleichen Register bleiben. ("r2" => Registervariable vom Type 2 und nicht Register R2, Registernummer ist der letzte Parameter!)
 +
 +<code>
 +.stabs "x:r2;-2147483648;2147483647;",N_RSYM,0,4,2
 +</code>
 +
 +
 +=== Definition von Funktionen ===
 +
 +([[https://www.sourceware.org/gdb/onlinedocs/stabs.html#Procedures|Procedures]]) N_LBRAC und N_RBRAC ist die Position der öffnenden/schliessenden geschweiften Klammern der Funktion.
 +
 +<code>
 +.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
 +</code>
 +
 +==== Debuggen mit GDB ====
 +
 +Damit ein PowerPC Target debugged werden kann muss GDB mit PowerPC Support installiert werden:
 +
 +<code>
 +$ sudo apt-get install gdb-multiarch
 +</code>
 +
 +Bevor GDB gestarted wird, muss das Image-File auf den MPC5200 geladen werden:
 +
 +<code>
 +$ telnet bdi3000inf01
 +pcm5200io> load 0x400000 pub/abajric/test.bin bin
 +pcm5200io> rm pc 0x400100
 +</code>
 +
 +GDB starten:
 +<code>
 +$ gdb-multiarch
 +</code>
 +
 +PowerPC Architektur auswählen:
 +
 +<code>
 +(gdb) set arch powerpc:common
 +</code>
 +
 +ELF-File mit Debug-Informationen auswählen:
 +
 +<code>
 +(gdb) file ./a.out
 +</code>
 +
 +GDB mit Abatron BDI3000 verbinden:
 +
 +<code>
 +(gdb) target remote bdi3000inf01:2001
 +</code>
 +
 +GDB TUI aktivieren und Layout umstellen:
 +
 +<code>
 +(gdb) layout split
 +(gdb) focus cmd
 +</code>
 +
 +Alternativ kann ein File (gdb.cmd) mit diesen GDB-Kommandos erstellt werden:
 +
 +<code>
 +set arch powerpc:common
 +file ./a.out
 +target remote bdi3000inf01:2001
 +layout split
 +focus cmd
 +</code>
 +
 +Beim Ausführen von GDB muss dieses File angegeben werden, damit alle Kommandos im File ausgeführt werden:
 +
 +<code>
 +$ gdb-multiarch -x ./gdb.cmd
 +</code>
 +
 +Mit dem folgenden Befehl kann der Java-Sourcecode angezeigt werden:
 +
 +<code>
 +(gdb) list
 +</code>
 +
 +Mit dem folgenden Befehl wird eine Assembler-Instruktion ausgeführt:
 +
 +<code>
 +(gdb) stepi
 +</code>
 +
 +Mit dem folgenden Befehl wird Code ausgeführt, bis eine neue Source-Zeile erreicht wurde:
 +
 +<code>
 +(gdb) next
 +</code>
 +
 +Mit dem folgenden Befehl wird eine definierte Variable ausgegeben:
 +
 +<code>
 +(gdb) print x
 +</code>
 +
 +Mit dem folgenden Befehl wird eine definierte Variable geändert:
 +
 +<code>
 +(gdb) set var x = 12345
 +</code>
 +
 +Mit dem folgenden Befehl kann im Memory geschrieben werden:
 +
 +<code>
 +(gdb) set var *0x100000 = 12345
 </code> </code>