Programowanie Systemów Wbudowanych Debugowanie z GDB Iwona Kochańska Gdansk University of Technology
GNU debugger Identyfikacja i naprawianie błędów to część procesu wytwarzania oprogramowania Techniki wykrywania błędów analiza statyczna analiza dynamiczna static analysis inspekcja kodu (code review) tracing, profiling, interaktywne debugoweanie GNU debugger (GDB) - narzędzie do debugowania aplikacji i kodu jadra pracuje na poziomie kodu (głównie C i C++) strona projektu: http://www.gnu.org/software/gdb GUT Intel 2015/16 2/19
Przygotowanie do debugowania Kod powinien być skompilowany wraz z symbolami dla debuggera (debug symbols). Opcje GCC: -g: generuje informację w formacie odpowiednim dla maszyny docelowej -ggdb - generuje informację właściwa dla konkretnego GDB (w przypadku OS Linux różnica jest prawie żadna) Obydwie opcje umożliwiaja wybór poziomu debugowania (level of debug information): 0: brak infromacji dla debuggera 1: informacja o nazwach funkcji i zmiennych zewnętrznych (external variables); to wystarczajaca informacja dla wygenerowania back trace 2: (domyślnie) informacja o zmiennych lokalnych i numerach linii - możliwe debugowanie na poziomie kodu 3: najwyższy poziom GUT Intel 2015/16 3/19
Przygotowanie do debugowania Level of debug information W większości przypadków wystarcza -g (-g2) -g3 lub -ggdb3 - kiedy pojawia się problem z przejściem przez kod krok po kroku Mechanizm optymalizacji kompilacji przeszkadza w debugowaniu, bo psuje powiazania między kodem źródłowym a kodem maszynowym poziom optymalizacji kodu: brak, -O1, -O2, -O3, -OS (opt. ze względu na rozmiar) Dwa sposoby korzystania z GDB: natywnie - jeśil kod jest kompilowany i uruchamiany na tej samej maszynie w środowisku skrośnym - większość przypadków systemów wbudowanych GUT Intel 2015/16 4/19
Zdalne debugowanie - gdbserver gdbserver - program uruchamiany na maszynie docelowej, kontrolujacy wykonanie debugowanego programu łaczy się z kopia GDB na maszynie hosta przez interfejs Ethernet lub szeregowy GUT Intel 2015/16 5/19
Zdalne debugowanie - gdbserver Sesja debuggera rozpoczyna się od załadowania programu-aplikacji na maszynę docelowa (target) Niezależnie trzeba załadować GDB z cross toolchain na maszynie hosta GDB i gdbserver musza się ze soba komunikować GDB (host) musi wiedzieć, gdzie należy szukać symboli debugger i kodu źródłowego aplikacji i bibliotek współdzielonych Symbole debugger i kod źródłowy nie musza być obecne na maszynie docelowej (brak miejsca!) Istniej a pewne różnice między GDB/gdbserver a natywnym GDB - nie ma możliwości śledzenia procesów potomnych (po wywołaniu fork()) przez gdbserver GUT Intel 2015/16 6/19
Zdalne debugowanie - gdbserver GDB i gdb server powinny być: tej samej wersji, skonfigurowane tak samo, najlepiej zbudowane z tych samych źródeł. Symole debuggera zwiększaja rozmiar pliku wykonywalnego (nawet 10X!) Usunięcie symboli bez ponownej kompilacji - narzędzie strip Opcje: strip-all: (default) usuwa wszystkie symbole; OK dla aplikacji i bibliotek współdzielonych strip-unneeded: usuwa symbole niepotrzebne przy relokacji OK dla modułów jadra GUT Intel 2015/16 7/19
Przygotowanie w build system Yocto Project Buildroot dodaj do conf/local.conf: IMAGE_INSTALL_append = " gdbserver" BR2_PACKAGE_HOST_GDB w menu Toolchain Build cross gdb for the host BR2_PACKAGE_GDB w menu Target packages Debugging, profiling and benchmark gdb BR2_PACKAGE_GDB_SERVER w menu Target packages Debugging, profiling and benchmark gdbserver GUT Intel 2015/16 8/19
Rozpoczęcie debuggowania gdbserver zainstalowany na maszynie docelowej i cross-gdb zainstalowany na maszynie hosta Połaczenie GDB z gdbserver przez sieć [target] uruchom gdbserver z numerem portu TCP (na którym ma słuchać) i opcjonalnie adresem IP, skad nadejdzie żadanie połaczenia GUT Intel 2015/16 9/19
Rozpoczęcie debuggowania Przykład: gdbserver czeka na porcie 10000 na żadanie od kogokolwiek [host] Uruhom kopię GDB z toolchain-a, podajac jako argument debugowany program (GDB musi załadować tablicę symboli) [host] w GDB: polecenie target remote by ustanowić połaczenie z maszyna docelowa (podaje się nr IP lub nazwę hosta oraz port) [host] gdbserver nawiazuje połaczenie z hostem GUT Intel 2015/16 10/19
Rozpoczęcie debuggowania Połaczenie GDB i gdbserver przez interfejs szeregowy [target] uruchom gdbserver podajac nazwę portu szeregowego: [target] ustaw szybkość transmisji [host] GDB z komenda target remote i nazwa urzadzenia szeregowego hosta GUT Intel 2015/16 11/19
Rozpoczęcie debuggowania Ustawienie ścieżki roota (sysroot) GDB musi wiedzieć, gdzie znaleźć symbole debuggera i kod źródłowy dla bibliotek współdzielonych Debuggowanie natywne - nie ma problemu, ścieżki sa znane Debuggowanie skrośne - trzeba ustawić ścieżkę roota (sysroot) (gdb) set sysroot ~/<unpacked_image Plik poleceń GDB. GDB czyta komendy z: $HOME/.gdbinit.gdbinit w bieżacej ścieżce (problemy w nowszych wersjach GDB) plików podanych w linii poleceń po opcji -x GUT Intel 2015/16 12/19
GDB - komendy Breakpoints GUT Intel 2015/16 13/19
GDB - komendy Running and stepping GUT Intel 2015/16 14/19
GDB - komendy Information GUT Intel 2015/16 15/19
GDB - przejście do pułapki (breakpoint) [target] gdbserver ładuje program do pamięci i ustawia pułapkę (breakpoint) na pierwszej instrukcji. Następnie czeka na GDB. [target] po ustanowieniu połaczenia z GDB rozpoczyna sesję debugowania [target] po wykonaniu pierwszego kroku: program zawiesza działania na kodzie odpowiedzialnym za środowisko runtime C/C++ należy ustawić pułapkę za funkcji main()! I wówczas: continue (c) Jesli w tym miejscu pojawiaja się problemy, prawie na pewno nie jest ustawiona ścieżka roota (sysroot) GUT Intel 2015/16 16/19
GDB Terminal user interface Okno kodu, pokazujace linie w sasiedztwie linii wykonywanej (wraz z pułapkami/breakpoints) Tryb tekstowy Można używać go w terminalu ssh (gdy GDB działa natywnie na maszynie docelowej) Uruchomienie: GDB z opcja -tui GUT Intel 2015/16 17/19
GDB - Data display debugger Data display debugger (DDD) - prosty interfejs graficzny dla GDB Opcja debugger - informacja dla DDD o użyciu GDB z toolchain-a Argument -x: plik poleceń GDB GUT Intel 2015/16 18/19
GDB - Eclipse Eclipse C development toolkit (CDT) plug-in - wspiera debugowanie z GDB, również debuggowanie zdalne GUT Intel 2015/16 19/19