GNU Debugger
Vyvinul | Projekt GNU |
---|---|
První verze | 1986 |
Poslední verze | 10,2 (25. dubna 2021) |
Vklad | sourceware.org/git/gitweb.cgi?p=binutils-gdb.git |
Napsáno | C a schéma |
Operační systém | GNU / Linux , BSD ( d ) , Microsoft Windows a macOS |
Jazyky | Angličtina |
Typ | Debugger |
Licence | GPL-3.0 + ( d ) |
webová stránka | www.gnu.org/software/gdb |
GNU Debugger , také nazývaný GDB , jestandardní debugger pro projekt GNU . Je přenosný na mnoha unixových systémech a funguje pro několik programovacích jazyků, jako jsou C , C ++ , Fortran , Ada , Objective-C a Go . Autorem byl Richard Stallman v roce 1988. GDB je svobodný software vydaný pod licencí GNU GPL .
GDB byl nejprve napsán podle Richarda Stallmana v roce 1986 po boku svého GNU systému , po GNU Emacs byl považován za „rozumně stabilní“. GDB je bezplatný software vydávaný na základě GNU General Public License (GPL). Je inspirován debuggerem DBX , který byl součástí unixové distribuce Berkeley .
V letech 1990 až 1993 ji udržoval John Gilmore . Nyní je udržován řídícím výborem GDB, který byl založen Free Software Foundation .
GDB pracuje na mnoha různých architekturách procesorů a umožňuje vzdálené ladění (běžící přes sériové nebo IP připojení) aplikací běžících na cílové platformě odděleně od vývojové platformy. To možná na dvou různých typech procesorů.
GDB umožňuje ladění spuštěného programu (odvíjením instrukce instrukcí nebo zkoumáním a úpravou jeho dat), ale také umožňuje posmrtné ladění analýzou souboru jádra, který představuje obsah dokončeného programu.
Rozhraní GDB je jednoduchý příkazový řádek, ale existují front-end aplikace, které mu dávají mnohem uživatelsky přívětivější grafické rozhraní. Obslužný program ddd například umožňuje kliknout na řádek kódu přímo v seznamu a umístit tam zarážku, zatímco samotný GDB vyžaduje zadání čísla řádku. Všimněte si také, že GDB je často vyvoláván na pozadí integrovanými vývojovými prostředími, jako je Eclipse .
GDB nabízí „vzdálený“ režim, který lze často použít při ladění na integrovaných systémech. Vzdálená operace je, když GDB běží na jednom počítači a laděný program běží na jiném počítači . GDB může také komunikovat se vzdáleným „stubem“, který rozumí protokolu GDB, přes sériové zařízení nebo přes protokol TCP / IP . Náhradní program lze vytvořit propojením s příslušnými stub soubory dodávanými s GDB, které implementují cílovou stranu komunikačního protokolu. Je také možné použít gdbserver ke vzdálenému ladění programu, aniž byste jej museli upravovat.
KGDB také používá stejný režim k ladění běžícího linuxového jádra na zdrojové úrovni pomocí gdb. S KGDB mohou vývojáři jádra ladit jádro stejným způsobem, jakým ladí aplikační programy. Umožňuje vám umístit zarážky do kódu jádra, projít kódem a také sledovat proměnné. Na některých architekturách, kde jsou k dispozici registry ladění hardwaru, je možné definovat kontrolní body, které spouštějí zarážky při provádění zadaných adres paměti. KGDB vyžaduje, aby byl pomocí sériového nebo ethernetového kabelu odladěn další počítač připojený k počítači . V operačním systému FreeBSD je také možné ladit pomocí přímého přístupu k paměti Firewire.
gdb program | spusťte gdb s programem "program" |
---|---|
spustit -v | spusťte program načtený s parametrem "-v" |
bt | zobrazí trasování hovorů (užitečné v případě selhání programu) |
informační registry | zobrazí všechny registry |
řekni ruku | rozebrat hlavní funkci |
Zvažte následující zdrojový kód napsaný v jazyce C:
//Bibliothèques standard du C #include <stdio.h> #include <stdlib.h> #include <string.h> size_t foo_len( const char *s ) { return strlen( s ); } int main( int argc, char *argv[] ) { const char *a = NULL; printf( "size of a = %lu\n", foo_len(a) ); return 0; }Pokud používáte kompilátor GCC v systému Linux , výše uvedený kód by měl být kompilován s příznakem -g, aby zahrnoval příslušné ladicí informace o generovaném binárním souboru, což umožňuje jeho kontrolu pomocí GDB. Za předpokladu, že soubor obsahující výše uvedený kód se nazývá example.c, příkaz pro kompilaci může být:
$ gcc exemple.c -Og -g -o exempleA binární soubor lze nyní spustit:
$ ./exemple Segmentation faultKdyž je binární soubor spuštěn, generuje chybu segmentace, GDB lze použít ke kontrole problému za účelem jeho vyřešení.
$ gdb ./exemple GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://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". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /path/exemple...done. (gdb) run Starting program: /path/exemple Program received signal SIGSEGV, Segmentation fault. 0x0000000000400527 in foo_len (s=0x0) at exemple.c:8 8 return strlen (s); (gdb) print s $1 = 0x0Problém je přítomen na řádku 8 a nastává při volání funkce strlen (protože jeho argument s je NULL). V závislosti na implementaci strlen (online nebo ne) se může výsledek lišit, například:
GNU gdb (GDB) 7.3.1 Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://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 "i686-pc-linux-gnu". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /tmp/gdb/exemple...done. (gdb) run Starting program: /tmp/gdb/exemple Program received signal SIGSEGV, Segmentation fault. 0xb7ee94f3 in strlen () from /lib/i686/cmov/libc.so.6 (gdb) bt #0 0xb7ee94f3 in strlen () from /lib/i686/cmov/libc.so.6 #1 0x08048435 in foo_len (s=0x0) at exemple.c:8 #2 0x0804845a in main (argc=<optimized out>, argv=<optimized out>) at exemple.c:16Chcete-li tento problém vyřešit, musí proměnná a (v hlavní funkci) obsahovat platný řetězec. Například :
//Bibliothèques standard du C #include <stdio.h> #include <stdlib.h> #include <string.h> size_t foo_len( const char *s ) { return strlen(s); } int main( int argc, char *argv[] ) { //correction ici const char *a = "Hello World!\n"; printf( "size of a = %lu\n", foo_len(a) ); return 0; }Nyní, když překompilujeme a znovu spustíme binární soubor s GDB, je výsledek správný:
GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://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". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /path/exemple...done. (gdb) run Starting program: /path/exemple size of a = 13 [Inferior 1 (process 14290) exited normally]GDB zobrazuje na standardním výstupu, že program skončil normálně.