GNU/Linux >> Znalost Linux >  >> Linux

Jak ladit program C pomocí gdb v 6 jednoduchých krocích

Dříve jsme diskutovali o základech, jak napsat a zkompilovat program C pomocí programu C Hello World.

V tomto článku probereme, jak ladit program c pomocí ladicího programu gdb v 6 jednoduchých krocích.

Napište ukázkový program C s chybami pro účely ladění

Abychom se naučili ladění programu C, vytvořte si následující program v C, který vypočítá a vypíše faktoriál čísla. Tento program C však obsahuje některé chyby pro naše účely ladění.

$ vim factorial.c
# include <stdio.h>

int main()
{
	int i, num, j;
	printf ("Enter the number: ");
	scanf ("%d", &num );

	for (i=1; i<num; i++)
		j=j*i;    

	printf("The factorial of %d is %d\n",num,j);
}
$ cc factorial.c

$ ./a.out
Enter the number: 3
The factorial of 3 is 12548672

Pojďme jej odladit a zároveň si prohlédnout nejužitečnější příkazy v gdb.

Krok 1. Zkompilujte program C s volbou ladění -g

Zkompilujte svůj program v C s volbou -g. To umožňuje kompilátoru shromažďovat informace o ladění.

$ cc -g factorial.c

Poznámka:Výše ​​uvedený příkaz vytvoří soubor .out, který bude použit pro ladění, jak je uvedeno níže.

Krok 2. Spusťte gdb

Spusťte ladicí program C (gdb), jak je znázorněno níže.

$ gdb a.out

Krok 3. Nastavte bod přerušení v programu C

Syntax:

break line_number

Jiné formáty:

  • konec [název_souboru]:číslo_řádku
  • break [file_name]:func_name

Umístí bod přerušení do programu C, kde máte podezření na chyby. Při provádění programu se ladicí program zastaví v bodě přerušení a zobrazí výzvu k ladění.

Před spuštěním programu tedy umístěte do našeho programu následující bod přerušení.

break 10
Breakpoint 1 at 0x804846f: file factorial.c, line 10.

Krok 4. Spusťte program C v debuggeru gdb

run [args]

Program můžete spustit pomocí příkazu run v debuggeru gdb. Můžete také zadat argumenty příkazového řádku programu pomocí příkazů run args. Vzorový program, který jsme zde použili, nevyžaduje žádné argumenty příkazového řádku, takže spusťte a spusťte program.

run
Starting program: /home/sathiyamoorthy/Debugging/c/a.out

Jakmile spustíte program C, spustí se až do prvního bodu přerušení a zobrazí výzvu k ladění.

Breakpoint 1, main () at factorial.c:10
10			j=j*i;

K ladění programu C můžete použít různé příkazy gdb, jak je vysvětleno v sekcích níže.

Krok 5. Tisk hodnot proměnných v debuggeru gdb

Syntax: print {variable}

Examples:
print i
print j
print num
(gdb) p i
$1 = 1
(gdb) p j
$2 = 3042592
(gdb) p num
$3 = 3
(gdb)

Jak vidíte výše, v faktorial.c jsme neinicializovali proměnnou j. Získává tedy nesmyslnou hodnotu, která má za následek velká čísla jako faktoriální hodnoty.

Opravte tento problém inicializací proměnné j na 1, zkompilujte program C a spusťte jej znovu.

I po této opravě se zdá, že je v programu factorial.c nějaký problém, protože stále dává nesprávnou hodnotu faktoriálu.

Umístěte tedy bod přerušení na 10. řádek a pokračujte, jak je vysvětleno v další části.

Krok 6. Pokračujte, překračujte a zadávejte – příkazy gdb

Když se program zastaví v bodě přerušení, můžete si vybrat ze tří druhů operací gdb. Pokračují až do dalšího bodu přerušení, vstoupí nebo překročí další programové řádky.

  • c nebo pokračovat:Debugger bude pokračovat v provádění až do dalšího bodu přerušení.
  • n nebo next:Debugger provede další řádek jako jednu instrukci.
  • s nebo krok:Stejné jako další, ale nepovažuje funkci za jedinou instrukci, místo toho přejde do funkce a provede ji řádek po řádku.

Pokračováním nebo procházením byste mohli zjistit, že problém je způsoben tím, že jsme nepoužili <=v kontrole stavu „smyčka for“. Takže změna z

zkratky příkazů gdb

Pro většinu častých operací gdb použijte následující zkratky.

  • l – seznam
  • p – tisk
  • c – pokračovat
  • s – krok
  • ENTER:stisknutím klávesy enter znovu provedete dříve provedený příkaz.

Různé příkazy gdb

  • příkaz l: Pomocí příkazu gdb l nebo list vytiskněte zdrojový kód v režimu ladění. Použijte l číslo řádku pro zobrazení konkrétního čísla řádku (nebo) l funkci pro zobrazení konkrétní funkce.
  • bt:zpět – Tisk zpětné stopy všech snímků zásobníku nebo nejvnitřnějších COUNT snímků.
  • nápověda – Zobrazení nápovědy pro konkrétní téma gdb — help TOPICNAME.
  • ukončit – Ukončete ladicí program gdb.

Linux
  1. Ladění Linuxu pomocí ProcDump

  2. Jak povolit protokolování ladění NFS pomocí rpcdebug

  3. Jak získat MAC adresu vašeho stroje pomocí programu C?

  1. Jak ladit programy C v Linuxu pomocí gdb

  2. Jak upgradovat na Ubuntu 22.04 LTS – jednoduché kroky

  3. Výuka ladicího programu Perl:10 snadných kroků k ladění programu Perl

  1. Jak vytvořit soubory Linux Proc v programu C pomocí LKM

  2. Jak ladit linuxové jádro pomocí GDB a QEMU?

  3. Jak nastavit proměnnou prostředí v GDB pomocí příkazu shell?