Najděte chyby v Linuxu pomocí gdb

Chcete-li pochopit, jak můžete najít chyby v Linuxu pomocí gdb, musíte vidět příklad. Postup je nejjednodušší ukázat pomocí jednoduchého příkladu, tedy následujícího, dbgtst. c, je vytvořený program, který obsahuje typickou chybu.

 # include static char buf [256]; prázdný read_input (char * s); int hlavní (void) {char * input = NULL; / * Jen ukazatel, žádné úložiště pro řetězec * / read_input (vstup); / * Příkaz procesu. * / printf ("Zadali jste:% sn", vstup); / * ... _ * / návrat 0;} neplatný read_input (char * s) {printf ("Příkaz:"); get (s);} 

Hlavní funkce tohoto programu volá funkci read_input, aby dostala od uživatele vstupní řádek. Funkce read_input očekává pole znaků, ve kterém vrací to, co uživatel zadá. V tomto příkladu však hlavní volání read_input s neinicializovaným ukazatelem - to je chyba v tomto jednoduchém programu.

Vytvořte program pomocí gcc s volbou -g:

 gcc -g -o dbgtst dbgtst. c 

Ignorovat varovnou zprávu o tom, že funkce Get je nebezpečná; snažíte se využít nedostatek této funkce, abyste zjistili, jak můžete pomocí gdb zjistit chyby.

Chcete-li zobrazit problém s tímto programem, spusťte jej a zadejte příkaz test příkazu:

 . / dbgtst Příkaz: test Závada segmentace 

Program zmizí po zobrazení zprávy o poruše segmentace. Pro tak malý program, jako je tenhle, pravděpodobně zjistíte příčinu zkoumáním zdrojového kódu. V reálném světě však pravděpodobně nebudete vědět, co způsobuje chybu. To je, když musíte použít gdb k nalezení příčiny problému.

Chcete-li najít chybu pomocí gdb, postupujte takto:

  1. Načtěte program pod gdb.

    Například zadejte příkaz gdb dbgtst a načtěte program s názvem dbgtst v gdb.

  2. Spusťte program pod gdb zadáním příkazu run. Když program vyzve k zadání, zadejte nějaký vstupní text.

    Program se nezdaří, jako tomu bylo dříve. Zde je to, co se děje s programem dbgtst:

     (gdb)  spustit  Spuštění programu: / home / edulaney / swdev / dbgtst Příkaz:  test  Přijatý signál SIGSEGV, 0x400802b6 v get () z / lib / tls / libc. tak. 6 (gdb) 
  3. Pomocí příkazu where zjistíte, kde program zemřel.

    (gdb), kde # 0 0x400802b6 v get () z / lib / tls / libc. tak. 6 # 1 0x08048474 v read_input (s = 0x0) v dbgtst. c: 16 # 2 0x08048436 v main () v dbgtst. c: 7 (gdb)

     Výstup zobrazuje sled funkčních volání. Funkce volání # 0 - nejnovější - je funkce C knihovny.Získání volání pochází z funkce read_input (na řádku 16 souboru dbgtst.c), který je zase vyvolán z hlavní funkce na řádku 7 dbgtst. c soubor. 

    Pomocí příkazu seznamu zkontrolujte řádky podezřelého zdrojového kódu.

  4. V dbgtst můžete začít s řádkem 16 dbgtst. c:

    (gdb) seznam dbgtst. c: 16 11 návrat 0; 12} 13 prázdný read_input (char * s) 14 {15 printf ("Příkaz:"); 16 dostane (y); 17} 18 (gdb)

     Po pohledu na tento záznam můžete zjistit, že problémem může být způsob, jakým se volá read_input. Poté zadejte řádky v řádku 7 v dbgtst. c (kde vznikne volání read_input): 

    (gdb) seznam dbgtst. c: 7 2 statické char buf [256]; 3 prázdný read_input (char * s); 4 int hlavní (prázdné) 5 {6 char * vstup = NULL; / * Jen ukazatel, žádné úložiště pro řetězec * / 7 read_input (vstup); 8 / * Příkaz procesu. * / 9 printf ("Zadali jste:% sn", vstup); 10 / * ... * / 11 návrat 0; (gdb)

     V tomto okamžiku můžete problém zúžit na proměnnou s názvem vstup. Tato proměnná je pole, nikoliv NULL (což znamená nulový ukazatel).