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.
1johannes@ubuntu:~$ gdb executable
2GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7
3Copyright (C) 2014 Free Software Foundation, Inc.
4License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
5This is free software: you are free to change and redistribute it.
6There is NO WARRANTY, to the extent permitted by law. Type "show copying"
7and "show warranty" for details.
8This GDB was configured as "x86_64-linux-gnu".
9Type "show configuration" for configuration details.
10For bug reporting instructions, please see:
11<http://www.gnu.org/software/gdb/bugs/>.
12Find the GDB manual and other documentation resources online at:
13<http://www.gnu.org/software/gdb/documentation/>.
14For help, type "help".
15Type "apropos word" to search for commands related to "word"...
16Reading symbols from executable...done.
17(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.
1(gdb) break 31
2Haltepunkt 1 at 0x8048074: file executable.s, line 31.
3(gdb) run
4Starting program: /home/johannes/executable
5
6Breakpoint 1, _start () at executable.s:32
7warning: Source file is more recent than executable.
832 movl $0, %edi # init counter
9(gdb)
Um die Werte der Register anzusehen, dann einfach info registers
oder kurz i r
eingeben.
1(gdb) i r
2eax 0x0 0
3ecx 0x0 0
4edx 0x0 0
5ebx 0x0 0
6esp 0xffffcfb0 0xffffcfb0
7ebp 0x0 0x0
8esi 0x0 0
9edi 0x0 0
10eip 0x8048074 0x8048074 <_start>
11eflags 0x202 [ IF ]
12cs 0x23 35
13ss 0x2b 43
14ds 0x2b 43
15es 0x2b 43
16fs 0x0 0
17gs 0x0 0
18(gdb)
Mit continue
oder c
kann man die Ausführung fortsetzen.