Entwicklung

Debuggen mit gdb

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

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.

johannes@ubuntu:~$ 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.