Szukaj…


Uwagi

GDB (debuger projektu GNU) to bazowy debugger wiersza poleceń, który jest dobry w analizie uruchomionych i rdzennych programów. Zgodnie z instrukcją obsługi GDB obsługuje C, C ++, D, Go, Objective-C, Fortran, Java, OpenCL C, Pascal, Rust, asembler, Modula-2 i Ada.

GDB ma taki sam zestaw funkcji jak większość debuggerów, ale różni się od większości, z których korzystałem, wszystko opiera się na wpisywaniu poleceń zamiast klikania elementów GUI. Niektóre z tych funkcji obejmują:

  • Ustalanie punktów przerwania
  • Drukowanie wartości zmiennych.
  • Ustawienie wartości zmiennych do testowania.
  • Wyświetlanie stosu

Co to jest GDB?

GDB, skrót od GNU Debugger, jest najpopularniejszym debuggerem dla systemów UNIX do debugowania programów C i C ++. Debuger GNU, zwany także gdb, jest najpopularniejszym debuggerem dla systemów UNIX do debugowania programów w C i C ++.

Debuger GNU pomaga uzyskać informacje o następujących kwestiach:

  • Jeśli nastąpił zrzut pamięci, to na jakiej instrukcji lub wyrażeniu program się zawiesił?

  • Jeśli wystąpi błąd podczas wykonywania funkcji, to jaki wiersz
    program zawiera wywołanie tej funkcji i jakie są
    parametry?

  • Jakie są wartości zmiennych programu w danym punkcie podczas wykonywania programu?

  • Jaki jest wynik określonego wyrażenia w programie?

Uruchamianie GDB

Aby uruchomić GDB, w terminalu

gdb <executable name>

W powyższym przykładzie z programem o nazwie main polecenie staje się

gdb main

Ustawianie punktów przerwania

Prawdopodobnie będziesz chciał, aby Twój program zatrzymał się w pewnym momencie, abyś mógł sprawdzić stan swojego programu. Linia, przy której chcesz tymczasowo zatrzymać program, nazywa się punktem przerwania.

break <source code line number>

Uruchamianie programu

Aby uruchomić program, polecenie, jak się domyślacie,

run

Otwieranie rdzenia

gdb -c coreFile pathToExecutable  

Praca z plikiem podstawowym

Stworzyłem ten naprawdę zły program

 #include <stdio.h>
 #include <ctype.h>

// forward declarations


void bad_function()
{

   int *test = 5;

   free(test);

}


int main(int argc, char *argv[])
{
   bad_function();
   return 0;
}


gcc -g ex1.c

./a.out   //or whatever gcc creates
Segmentation fault (core dumped)

gdb -c core a.out

Core was generated by `./a.out'.

Program zakończony sygnałem SIGSEGV, błąd segmentacji. # 0 __GI___libc_free (mem = 0x5) w malloc.c: 2929 2929 malloc.c: Brak takiego pliku lub katalogu.

(gdb) where

# 0 __GI___libc_free (mem = 0x5) w malloc.c: 2929 # 1 0x0000000000400400549 w bad_function () w ex1.c: 12 # 2 0x0000000000400564 w main (argc = 1, argv = 0x7fffb825bd68) w ex1.c: 19

Ponieważ skompilowałem z -g, możesz zobaczyć, że to wywołanie mówi mi, że nie podoba mu się kod w linii 12 bad_function ()

Następnie mogę zbadać zmienną testową, którą próbowałem uwolnić

(gdb) up

# 1 0x0000000000400549 w bad_function () w ex1.c: 12 12 za darmo (test);

(gdb) print test

1 $ = (int *) 0x5

(gdb) print *test

Nie można uzyskać dostępu do pamięci pod adresem 0x5

W tym przypadku błąd jest dość oczywisty Próbowałem uwolnić wskaźnik, któremu właśnie przypisano adres 5, który nie został utworzony przez Malloc, więc free nie ma pojęcia, co z tym zrobić.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow