GNU/Linux >> Znalost Linux >  >> Linux

Jak ladit programy C v Linuxu pomocí gdb

Bez ohledu na to, jak zkušený kodér jste, žádný software, který vyvíjíte, nemůže být zcela bez chyb. Identifikace chyb a jejich oprava je tedy jedním z nejdůležitějších úkolů v cyklu vývoje softwaru. I když existuje mnoho způsobů, jak identifikovat chyby (testování, vlastní kontrola kódu a další), existuje specializovaný software – nazvaný debuggery – který vám pomůže přesně pochopit, kde je problém, abyste jej mohli snadno opravit.

Pokud jste programátor v C/C++ nebo vyvíjíte software pomocí programovacích jazyků Fortran a Modula-2, budete rádi, že existuje vynikající debugger – nazvaný GDB – který vám umožní snadno ladit chyby a jiné problémy ve vašem kódu. V tomto článku probereme základy GDB, včetně některých užitečných funkcí/možností, které poskytuje.

Než ale pokročíme dále, stojí za zmínku, že všechny pokyny a příklady uvedené v tomto článku byly testovány na Ubuntu 14.04LTS. Ukázkový kód použitý v tutoriálu je napsán v jazyce C; shell příkazového řádku, který jsme použili, je bash (verze 4.3.11); a verze GDB, kterou jsme použili, je 7.7.1.

Základy ladicího programu GDB

Laicky řečeno, GDB vám umožňuje nahlédnout dovnitř programu, zatímco se program spouští, což vám umožní zjistit, kde přesně je problém. Použití ladicího programu GDB probereme na pracovním příkladu v další části, ale předtím si zde probereme několik základních bodů, které vám později pomohou.

Za prvé, abyste mohli úspěšně používat debuggery, jako je GDB, musíte svůj program zkompilovat tak, aby kompilátor také produkoval ladicí informace, které ladicí programy vyžadují. Například v případě kompilátoru gcc, který budeme používat ke kompilaci ukázkového programu C později v tomto tutoriálu, musíte použít -g možnost příkazového řádku při kompilaci kódu.

Chcete-li vědět, co o této možnosti příkazového řádku říká manuálová stránka kompilátoru gcc, přejděte sem.

Dalším krokem je ujistit se, že máte v systému nainstalovanou GDB. Pokud tomu tak není a používáte systém založený na Debianu, jako je Ubuntu, můžete nástroj snadno nainstalovat pomocí následujícího příkazu:

sudo apt-get install gdb

Chcete-li nainstalovat jakoukoli jinou distribuci, přejděte sem.

Nyní, jakmile zkompilujete svůj program tak, aby byl připraven k ladění, a GDB je ve vašem systému, můžete spustit svůj program v režimu ladění pomocí následujícího příkazu:

gdb [prog-executable-name]

I když to spustí ladicí program GDB, spustitelný soubor vašeho programu se v tomto okamžiku nespustí. Toto je čas, kdy můžete definovat nastavení související s laděním. Můžete například definovat bod přerušení, který GDB řekne, že má pozastavit provádění programu na konkrétním čísle řádku nebo funkci.

Abyste mohli svůj program skutečně spustit, budete muset provést následující příkaz gdb:

run

Zde stojí za zmínku, že pokud váš program vyžaduje, aby mu byly předány nějaké argumenty příkazového řádku, můžete je zadat zde. Například:

run [arguments]

GDB poskytuje mnoho užitečných příkazů, které se hodí při ladění. Některé z nich probereme v příkladu v další části.

Příklad použití GDB

Nyní máme základní představu o GDB a také o jeho použití. Vezměme si tedy příklad a aplikujme poznatky tam. Zde je příklad kódu:

#include <stdio.h>

int main()
{
int out = 0, tot = 0, cnt = 0;
int val[] = {5, 54, 76, 91, 35, 27, 45, 15, 99, 0};

while(cnt < 10)
{
out = val[cnt];
tot = tot + 0xffffffff/out;
cnt++;
}

printf("\n Total = [%d]\n", tot);
return 0;
}

V zásadě tedy tento kód dělá to, že vybere každou hodnotu obsaženou v poli „val“, přiřadí ji k celému číslu „out“ a poté vypočítá „tot“ sečtením předchozí hodnoty proměnné a výsledku „0xffffffff/ ven.“

Problém je v tom, že při spuštění kódu se zobrazí následující chyba:

$ ./gdb-test 
Floating point exception (core dumped)

Takže k odladění kódu by prvním krokem bylo zkompilovat program s -g. Zde je příkaz:

gcc -g -Wall gdb-test.c -o gdb-test

Dále spustíme GDB a dáme mu vědět, který spustitelný soubor chceme ladit. Zde je příkaz:

gdb ./gdb-test 

Chyba, kterou dostávám, je „výjimka s plovoucí desetinnou čárkou“ a jak už většina z vás možná ví, je způsobena n % x, když x je 0. Takže s ohledem na to jsem na číslo řádku vložil bod přerušení 11, kde probíhá dělení. To bylo provedeno následujícím způsobem:

(gdb) break 11

Všimněte si, že '(gdb)' je výzva ladicího programu, právě jsem napsal příkaz 'break'.

Nyní jsem požádal GDB, aby spustilo provádění programu:

run

Takže, když byl bod přerušení zasažen poprvé, GDB ukázal ve výstupu toto:

Breakpoint 1, main () at gdb-test.c:11
11 tot = tot + 0xffffffff/out;
(gdb)

Jak můžete vidět na výstupu výše, debugger ukázal řádek, kam byl vložen bod přerušení. Nyní vytiskněme aktuální hodnotu 'out'. To lze provést následujícím způsobem:

(gdb) print out
$1 = 5
(gdb)

Jak vidíte, byla vytištěna hodnota „5“. Takže v tuto chvíli je vše v pořádku. Požádal jsem debugger, aby pokračoval ve vykonávání programu až do dalšího bodu přerušení, což lze provést pomocí příkazu 'c'.

c  

Pokračoval jsem v této práci, dokud jsem neviděl, že hodnota 'out' je nulová.

...
...
...
Breakpoint 1, main () at gdb-test.c:11
11 tot = tot + 0xffffffff/out;
(gdb) print out
$2 = 99
(gdb) c
Continuing.

Breakpoint 1, main () at gdb-test.c:11
11 tot = tot + 0xffffffff/out;
(gdb) print out
$3 = 0
(gdb)

Nyní, abych potvrdil, že se jedná o přesný problém, jsem tentokrát použil příkaz GDB 's' (nebo 'step') namísto 'c'. Důvodem je to, že jsem jen chtěl, aby se spustil řádek 11, kde je provádění programu momentálně pozastaveno, a uvidíme, zda v tomto bodě nedojde ke zhroucení.

Zde je to, co se stalo:

(gdb) s

Program received signal SIGFPE, Arithmetic exception.
0x080484aa in main () at gdb-test.c:11
11 tot = tot + 0xffffffff/out;

Ano, jak potvrzuje zvýrazněný výstup výše, zde byla vyvolána výjimka. Konečné potvrzení přišlo, když jsem znovu zkusil spustit příkaz 's':

(gdb) s 

Program terminated with signal SIGFPE, Arithmetic exception.
The program no longer exists.

Tímto způsobem tedy můžete ladit své programy pomocí GDB.

Závěr

Právě jsme zde poškrábali povrch, protože GDB nabízí uživatelům spoustu funkcí, které mohou prozkoumat a používat. Projděte si manuálovou stránku GDB, abyste se o tomto nástroji dozvěděli více, a zkuste jej použít, kdykoli něco ve svém kódu ladíte. S debuggerem je spojena určitá křivka učení, ale stojí to za tu tvrdou práci.


Linux
  1. Jak vytvořit uživatele Linuxu pomocí Ansible

  2. Linux – Jak ladit problém s pozastavením paměti RAM v systému Linux?

  3. Jak restartovat Linux pomocí příkazového řádku

  1. Ladění Linuxu pomocí ProcDump

  2. Jak zabít proces v Linuxu pomocí příkazu?

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

  1. Jak rozšířit odkládací prostor pomocí odkládacího souboru v Linuxu

  2. Jak automatizovat úlohy v Linuxu pomocí Crontab

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