raspberry-pi-arm-assembly
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| raspberry-pi-arm-assembly [2021/04/18 13:35] – angelegt benny | raspberry-pi-arm-assembly [2024/06/09 10:29] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
|---|---|---|---|
| Zeile 32: | Zeile 32: | ||
| </ | </ | ||
| + | ===== Debug mit gdb ===== | ||
| + | Notizen für die Benutzung von gdb | ||
| + | |||
| + | ==== Breakpoint setzen ==== | ||
| + | < | ||
| + | (gdb) break _start | ||
| + | Breakpoint 1 at 0x10074 | ||
| + | </ | ||
| + | |||
| + | ==== Programm ausführen ==== | ||
| + | < | ||
| + | (gdb) run | ||
| + | Starting program: / | ||
| + | |||
| + | Breakpoint 1, 0x00010074 in _start () | ||
| + | </ | ||
| + | |||
| + | ==== Programm disassemblen ==== | ||
| + | |||
| + | < | ||
| + | (gdb) disass | ||
| + | Dump of assembler code for function _start: | ||
| + | => 0x00010074 < | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | ==== Register ansehen ==== | ||
| + | < | ||
| + | (gdb) info reg | ||
| + | r0 | ||
| + | r1 | ||
| + | r2 | ||
| + | r3 | ||
| + | r4 | ||
| + | r5 | ||
| + | r6 | ||
| + | r7 | ||
| + | r8 | ||
| + | r9 | ||
| + | r10 0x0 0 | ||
| + | r11 0x0 0 | ||
| + | r12 0x0 0 | ||
| + | sp | ||
| + | lr | ||
| + | pc | ||
| + | cpsr | ||
| + | fpscr 0x0 0 | ||
| + | </ | ||
| + | |||
| + | ==== Nächste Instruktion ==== | ||
| + | < | ||
| + | (gdb) ni | ||
| + | 0x0001007c in _start () | ||
| + | (gdb) | ||
| + | </ | ||
| + | |||
| + | ==== gdbserver und remote==== | ||
| + | Ich hatte in einigen Fällen STDOUT nicht in der gdb-cmd-Ausgabe (zumindes nicht, wie ich es erwartet hatte). In solchen Fällen hilft es das Programm über gdbserver zu starten | ||
| + | < | ||
| + | gdbserver 127.0.0.1: | ||
| + | Listening on port 12345 | ||
| + | Remote debugging from host 127.0.0.1 | ||
| + | aaaabbb | ||
| + | </ | ||
| + | Nun steuert man das Programm remote via | ||
| + | < | ||
| + | gdb | ||
| + | target remote :12345 | ||
| + | break _start | ||
| + | cont | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== Umfangreichere gdb-Ansicht ==== | ||
| + | Mein Favorit ist "lay regs" da es die Register, den disassembled Code und die Command-Box zeigt. | ||
| + | < | ||
| + | (gdb) lay regs | ||
| + | </ | ||
| + | Wer dies gern nutzt, sollte es in der ~/.gdbinit hinterlegen. | ||
| + | Mit "focus cmd" funktioniert dann der "Pfeil nach oben" auch wieder. Wer im ASM-Code navigieren möchte, setzt den "focus asm" oder "focus prev". | ||
| + | |||
| + | ==== Speicher an einer bestimmten Stelle/ | ||
| + | < | ||
| + | (gdb) x/s 0x200db | ||
| + | 0x200db: | ||
| + | </ | ||
| + | |||
| + | ==== Verschiedene Ausgaben ==== | ||
| + | |||
| + | < | ||
| + | (gdb) p/d 0xA # hex to dec | ||
| + | $1 = 10 | ||
| + | (gdb) p/t 0xA # hex to bin | ||
| + | $2 = 1010 | ||
| + | (gdb) p/t 0x4 # dec to bin | ||
| + | $3 = 100 | ||
| + | (gdb) p/x 10 # dec to hex | ||
| + | $4 = 0xa | ||
| + | </ | ||
| + | |||
| + | ===== objdump ===== | ||
| + | |||
| + | ==== objdump -d ==== | ||
| + | < | ||
| + | objdump -d < | ||
| + | </ | ||
| + | |||
| + | ==== objdump -x ==== | ||
| + | < | ||
| + | objdump -x < | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== strace ===== | ||
| + | ==== Details zu strace ==== | ||
| + | < | ||
| + | strace ./ | ||
| + | execve(" | ||
| + | write(1, "Enter a character: ", 19Enter a character: ) = 19 | ||
| + | read(0, Benny | ||
| + | " | ||
| + | write(1, " | ||
| + | ) = 6 | ||
| + | exit(65) | ||
| + | +++ exited with 65 +++ | ||
| + | </ | ||
raspberry-pi-arm-assembly.1618752914.txt.gz · Zuletzt geändert: (Externe Bearbeitung)
