Der GNU Debugger, oder kurz gdb, der bereits in den meisten Linux-Distributionen enthalten ist, bietet eine einfache Möglichkeit in der Kommandozeile Programme zu debuggen. Gerade für Assembler-Anwendungen ist es damit einfach die Registerwerte auszulesen, den Speicher und den Stack zu begutachten.
Dazu sollten Debug-Informationen in die ausführbare Datei gespeichert werden. Für den Assembler as
ist zum Beispiel die Option -g
nötig. Dann kann man gdb mit gdb <executable>
starten. Es öffnet sich die gdb shell.
[email protected]:~$ gdb executable
GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from executable...done.
(gdb)
Dort kann man einen Breakpoint auf eine Zeile setzen. break 31
fügt ihm zum Beispiel auf Zeile 31 ein. Um das Programm zu starten, dann run
eingeben und gdb sollte die Ausführung am ersten Breakpoint pausieren.
(gdb) break 31
Haltepunkt 1 at 0x8048074: file executable.s, line 31.
(gdb) run
Starting program: /home/johannes/executable
Breakpoint 1, _start () at executable.s:32
warning: Source file is more recent than executable.
32 movl $0, %edi # init counter
(gdb)
Um die Werte der Register anzusehen, dann einfach info registers
oder kurz i r
eingeben.
(gdb) i r
eax 0x0 0
ecx 0x0 0
edx 0x0 0
ebx 0x0 0
esp 0xffffcfb0 0xffffcfb0
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x8048074 0x8048074 <_start>
eflags 0x202 [ IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x0 0
(gdb)
Mit continue
oder c
kann man die Ausführung fortsetzen.