Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

Debuggen mit gdb

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.