Debugowanie z produktem gdb
Debuger GNU (gdb) pozwala na sprawdzenie internałów innego programu, podczas gdy program jest wykonywany lub retrospektywnie, aby zobaczyć, co program robił w momencie, w którym się rozbił.
gdb umożliwia sprawdzanie i sterowanie wykonywaniem kodu i jest przydatne do oceny przyczyn awarii lub ogólnego nieprawidłowego zachowania. Produkt gdb nie obsługuje procesów Java™ , dlatego jest on ograniczony do używania w czystym programie Java. Jest on przydatny do debugowania rodzimych bibliotek i samej maszyny JVM.
Działające gdb
Produkt gdb można uruchomić na trzy sposoby:
- Uruchamianie programu
- Zwykle komenda:
gdb <application>jest używana do uruchamiania programu pod kontrolą gdb. Jednak ze względu na sposób uruchamiania środowiska Java, należy uruchomić produkt gdb , ustawiając zmienną środowiskową, a następnie wywołując środowisko Java:
Następnie zostanie wyświetlona zachęta gdb , a następnie zostanie podana komenda uruchamiania i argumenty Java:export IBM_JVM_DEBUG_PROG=gdb javar <java_arguments> - Dołączanie do działającego programu
- Jeśli program Java jest już uruchomiony, można go kontrolować za pomocą programu gdb. Identyfikator procesu uruchomionego programu jest wymagany, a następnie program gdb jest uruchamiany wraz z aplikacją Java jako pierwszy argument, a jako drugi argument identyfikator procesu:
gdb <Java Executable> <PID>Gdy program gdb jest przyłączony do działającego programu, ten program jest zatrzymany, a jego pozycja w kodzie jest wyświetlana dla przeglądarki. Program jest wtedy pod kontrolą systemu gdb i można uruchomić komendy, aby ustawić i wyświetlić zmienne i ogólnie sterować wykonywaniem kodu.
- Uruchamianie w zrzucie systemowym (plik core)
- Zrzut systemowy jest zwykle generowany, gdy program ulegnie awarii. Program gdb może być uruchomiony w tym zrzucie systemowym. Zrzut systemowy zawiera stan programu w momencie wystąpienia awarii. Użyj gdb , aby sprawdzić wartości wszystkich zmiennych i rejestrów prowadzących do awarii. Te informacje pomagają odkryć, co spowodowało awarię. Aby debugować zrzut systemowy, uruchom program gdb z plikiem aplikacji Java jako pierwszym argumentem i nazwą zrzutu systemowego jako drugim argumentem:
gdb <Java Executable> <system dump>Po uruchomieniu programu gdb na podstawie zrzutu systemowego, początkowo wyświetlane są informacje, takie jak sygnał zakończenia otrzymany przez program, wykonaną w tym czasie funkcję, a nawet wiersz kodu, który wygenerował błąd.
Gdy program znajduje się pod kontrolą systemu gdb, wyświetlany jest komunikat powitalny, po którym następuje zachęta (gdb). Program czeka teraz na wprowadzenie instrukcji. Dla każdej instrukcji program jest kontynuowany w zależności od tego, jaki sposób wybierzesz.
Ustawianie punktów zatrzymania i punktów kontrolnych
Punkty zatrzymania można ustawić dla określonej linii lub funkcji za pomocą komendy:
break linenumbersyspleksu
break functionNamePo ustawieniu punktu zatrzymania należy użyć komendy continue , aby program mógł być wykonywany do momentu osiągnięcia punktu zatrzymania.
Ustaw punkty zatrzymania za pomocą warunków warunkowych, tak aby program został zatrzymany tylko wtedy, gdy zostanie osiągnięty podany warunek. Na przykład użycie programu breakpoint 39 if var == value powoduje zatrzymanie programu, gdy osiągnie on linię 39, ale tylko wtedy, gdy zmienna jest równa określonej wartości.
Jeśli chcesz wiedzieć, gdzie , a także kiedy zmienna stała się pewną wartością, możesz użyć punktu kontrolnego. Ustaw punkt kontrolny, gdy zmienna, o której mowa, znajduje się w zasięgu. Po zakończeniu tej operacji użytkownik zostanie zaalarmowany za każdym razem, gdy ta zmienna będzie dołączać określoną wartość. Składnia komendy jest następująca: watch var == value.
Aby sprawdzić, które punkty zatrzymania i punkty kontrolne są ustawione, należy użyć komendy info :
info break
info watchhandle sig32 pass nostop noprint
handle sigusr2 pass nostop noprint Sprawdzanie kodu
backtrace (w skrócie bt), który przedstawia stos wywołań. Stos wywołań jest kolekcją ramek funkcyjnych, w których każda ramka funkcji zawiera informacje, takie jak parametry funkcji i zmienne lokalne. Te ramki funkcji są umieszczane na stosie wywołań w kolejności, w jakiej są wykonywane. Oznacza to, że ostatnio wywołana funkcja jest wyświetlana w górnej części stosu wywołań. Śledzenie wykonania programu można śledzić, sprawdzając stos wywołań. Po wyświetleniu stosu wywołań wyświetlany jest numer ramki na początku wiersza, po którym następuje adres funkcji wywołującej, po której znajduje się nazwa funkcji i plik źródłowy funkcji. Na przykład:#6 0x804c4d8 in myFunction () at myApplication.cAby wyświetlić bardziej szczegółowe informacje na temat ramki funkcji, należy użyć komendy frame wraz z parametrem określaniem numeru szafy systemowej. Po wybraniu ramki można wyświetlić jej zmienne za pomocą komendy print var.
Aby zmienić wartość zmiennej, należy użyć komendy print , na przykład print var = newValue.
Komenda info
locals wyświetla wartości wszystkich zmiennych lokalnych w wybranej funkcji.
Aby wykonać dokładną sekwencję wykonywania programu, należy użyć komend step i next . Obie komendy przyjmują opcjonalny parametr określający liczbę wierszy do wykonania. Jednak program next traktuje wywołania funkcji jako pojedynczy wiersz wykonania, podczas gdy produkt step przechodzi przez każdą linię wywołanej funkcji, po jednym kroku w danym momencie.
Przydatne komendy
Po zakończeniu debugowania kodu komenda run powoduje, że program jest uruchamiany aż do końca lub do punktu awarii. Komenda quit służy do wyjścia z programu gdb.
Inne przydatne komendy to:
ptype- Wyświetla typ danych zmiennej.
info share- Drukuje nazwy bibliotek współużytkowanych, które są obecnie załadowane.
info functions- Drukuje wszystkie prototypy funkcji.
list- Wyświetla 10 wierszy kodu źródłowego wokół bieżącego wiersza.
help- Wyświetla listę tematów, z których każda może wywołać komendę help, aby wyświetlić szczegółową pomoc dotyczącą tego tematu.