Vyhledávání na webu

GNU Debugger nebo GDB: Výkonný nástroj pro ladění zdrojového kódu pro linuxové programy


Ladicí program hraje zásadní roli v jakémkoli systému vývoje softwaru. Nikdo nemůže napsat kód bez chyb najednou. V průběhu vývoje se objevují chyby a je třeba je vyřešit pro další vylepšení. Vývojový systém je bez debuggeru neúplný. S ohledem na komunitu vývojářů open source je GNU Debugger jejich nejlepší volbou. Používá se také pro komerční vývoj softwaru na platformách typu UNIX.

GNU Debugger, také známý jako gdb, nám umožňuje proniknout kódem, když se spouští, nebo co se program pokoušel udělat v okamžiku před zhroucením. GDB nám v podstatě pomáhá udělat čtyři hlavní věci, abychom zachytili chyby ve zdrojovém kódu.

  1. Spusťte program a zadejte argumenty, které mohou ovlivnit obecné chování.
  2. Zastavte program za určitých podmínek.
  3. Zkontrolujte selhání nebo zastavení programu.
  4. Změňte kód a okamžitě experimentujte s upraveným kódem.

Můžeme použít gdb k ladění programů napsaných v C a C++ bez velkého úsilí. V současné době je podpora pro další programovací jazyky jako D, Modula-2, Fortran částečná.

Začínáme s GNU Debugger nebo GDB

GDB se vyvolává pomocí příkazu gdb. Při vydání gdb se zobrazí některé informace o platformě a zobrazí se výzva (gdb), jak je uvedeno níže .

[root@fedora20 ~]# gdb
Ukázkový výstup
GNU gdb (GDB) Fedora 7.6.50.20130731-19.fc20 
Copyright (C) 2013 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-redhat-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". 
(gdb)

Napište help list a vypište různé třídy příkazů dostupných v gdb. Zadejte help a za ním název třídy pro seznam příkazů v této třídě. Pro seznam všech příkazů zadejte help all. Zkratky názvů příkazů jsou povoleny, pokud jsou jednoznačné. Můžete například napsat n namísto psaní next nebo c pro pokračování a tak dále.

Nejčastěji používané příkazy GDB

Běžně používané příkazy gdb jsou uvedeny v následující tabulce. Tyto příkazy se používají z příkazového řádku gdb (gdb).

Command

Popis

run

Spustit provádění programu

quit

Ukončit gdb

print expr

Vytisknout výraz, kde expr může být také název proměnné

next

Přejít na další řádek

step

Přejděte na další řádek

continue

Pokračujte od aktuálního řádku do konce programu nebo dalšího bodu přerušení

Všimněte si rozdílu mezi těmito dvěma příkazy krok a další. Příkaz next nevstoupí do funkce, pokud je další řádek voláním funkce. Zatímco příkaz step může vstoupit do vnitřní funkce a zjistit, co se tam stane.

Ukázka relace s GDB

Zvažte následující zdrojový kód.


// sum.c
#include <stdio.h> 

int sum (int a, int b) { 
	int c; 
	c = a + b; 
	return c; 
} 

int main() { 
	int x, y, z; 
	printf("\nEnter the first number: "); 
	scanf("%d", &x); 
	printf("Enter the second number: "); 
	scanf("%d", &y); 
	z = sum (x, y); 
	printf("The sum is %d\n\n", z); 
	return 0; 
}

Abychom mohli odladit výstupní soubor, musíme jej zkompilovat s možností -g do gcc následovně.

gcc -g sum.c -o sum

Výstupní soubor sum lze připojit k gdb jedním z následujících 2 způsobů:

1. Zadáním výstupního souboru jako argumentu pro gdb.

gdb sum

2. Spuštění výstupního souboru uvnitř gdb pomocí příkazu file.

gdb
(gdb) file sum

Příkaz list zobrazí seznam řádků v souboru zdrojového kódu a přesune ukazatel. První seznam tedy zobrazí prvních 10 řádků a další seznam zobrazí dalších 10 a tak dále.

(gdb) list
1	#include <stdio.h>   
2	 
3	int sum (int a, int b) { 
4		int c; 
5		c = a + b; 
6		return c; 
7	} 
8	 
9	int main() { 
10		int x, y, z;

Chcete-li spustit provádění, zadejte příkaz run . Nyní se program normálně spustí. Ale zapomněli jsme do zdrojového kódu dát nějaké body přerušení pro ladění, že? Tyto body přerušení lze zadat pro funkce nebo na určených řádcích.

(gdb) b main

Poznámka: Použil jsem zkratku b pro přestávku.

Po nastavení bodu přerušení v hlavní funkci se opětovné spuštění programu zastaví na řádku 11. Totéž lze provést, pokud je číslo řádku známé dříve.

(gdb) b sum.c:11

Nyní procházejte řádky kódu pomocí příkazu next nebo n. Je důležité si uvědomit, že příkaz další nevstoupí do kódu funkce, pokud není u funkce nastaven bod přerušení. Nyní vyzkoušíme příkaz print. Nastavte bod přerušení na součtu funkce, jak je uvedeno níže.

(gdb) b sum 
Breakpoint 1 at 0x4005aa: file sum.c, line 5. 
(gdb) r 
Starting program: /root/sum 

Enter the first number: 2 
Enter the second number: 3 

Breakpoint 1, sum (a=2, b=3) at sum.c:5 
5		c = a + b; 
(gdb) p a 
$1 = 2 
(gdb) p b 
$2 = 3
(gdb) c 
Continuing. 
The sum is 5 

[Inferior 1 (process 3444) exited normally]

Pokud spouštěný program vyžaduje parametry příkazového řádku, zadejte je společně s příkazem run jako.

(gdb) run   . . .

Soubory sdílené knihovny přidružené k aktuálně spuštěnému programu mohou být uvedeny jako.

(gdb) info share 
From                To                  Syms Read   Shared Object Library 
0x00000035a6000b10  0x00000035a6019c70  Yes         /lib64/ld-linux-x86-64.so.2 
0x00000035a641f560  0x00000035a6560bb4  Yes         /lib64/libc.so.6

Modifikace proměnných

GDB je také schopen modifikovat proměnné během provádění programu. Pojďme si to vyzkoušet. Jak je uvedeno výše, nastavte bod přerušení na řádku 16 a spusťte program.

(gdb) r 
Starting program: /root/sum 

Enter the first number: 1 
Enter the second number: 2 

Breakpoint 1, main ( ) at sum.c:16 
16		printf("The sum is %d\n\n", z); 
(gdb) set z=4 
(gdb) c 
Continuing. 
The sum is 4

Nyní a=1, b=2 a výsledek by měl být z=3. Zde jsme ale v hlavní funkci změnili konečný výsledek naz=4. Tímto způsobem lze usnadnit ladění pomocí gdb.

Povolit/zakázat zarážky

Chcete-li získat seznam všech bodů přerušení, zadejte informační body přerušení.

(gdb) info breakpoints 
Num     Type           Disp Enb Address            What 
1       breakpoint     keep y   0x00000000004005c2 in main at sum.c:11

Zde je pouze jeden bod zlomu a to je To. povoleno zakázat body přerušení určete číslo bodu přerušení spolu s příkazem disable. Pro následné povolení použijte příkaz enable.

(gdb) disable 1 
(gdb) info breakpoints 
Num     Type           Disp Enb Address            What 
1       breakpoint     keep n   0x00000000004005c2 in main at sum.c:11

Body přerušení můžete také odstranit příkazem delete.

Ladění běžících procesů

V systému GNU/Linux běží na pozadí mnoho procesů. Abychom odladili běžící proces, musíme nejprve najít ID procesu tohoto konkrétního procesu. pidof příkaz vám dává pid procesu.

pidof <process_name>

Nyní musíme připojit tento pid k gdb. Existují 2 způsoby.

1. Zadáním pid spolu s gdb.

gdb -p <pid>

2. Pomocí příkazu attach z gdb.

(gdb) attach <pid>

To je prozatím vše. Toto jsou pouze základy gdb pro dobrý začátek při ladění zdrojového kódu a je to mnohem víc než věci vysvětlené výše. Můžeme například ladit pomocí informací o zásobníku, proměnných prostředí a mnoho dalšího. Zkuste si pohrát se všemi těmito věcmi…