GDB Samouczek
Rozpoczęcie pracy z GDB
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ć.