Ndk-Gdb

NDK zawiera skrypt powłoki o nazwie ndk-gdb, który uruchamia sesja debugowania natywnego wiersza poleceń. Użytkownicy, którzy wolą korzystać z GUI, powinni przeczytaj dokumentację debugowania w Android Studio.

Wymagania

Aby debugowanie natywne w wierszu poleceń działało, muszą być spełnione te wymagania:

  • Utwórz aplikację, korzystając ze skryptu ndk-build. Skrypt ndk-gdb nie obsługuje używania starszej metody make APP=<name> do tworzenia kompilacji.
  • Włącz debugowanie aplikacji w pliku AndroidManifest.xml, dodając parametr Element <application> ustawiający atrybut android:debuggable na true.
  • Utwórz aplikację pod kątem systemu Android 2.2 (Android API na poziomie 8) lub nowszego.
  • Debuguj na urządzeniu lub emulatorze z Androidem 2.2 lub nowszym. Do celów debugowania parametr docelowy Poziom interfejsu API zadeklarowany w pliku AndroidManifest.xml nie ma znaczenia.
  • Twórz aplikacje w powłoce Unix. w systemie Windows używaj Cygwin; lub eksperymentalny ndk-gdb-py Python implementacji.
  • Użyj programu GNU Make 3.81 lub nowszego.

Wykorzystanie

Aby wywołać skrypt ndk-gdb, przejdź do katalogu aplikacji lub dowolnego katalogu . Na przykład:

cd $PROJECT
$NDK/ndk-gdb

W tym miejscu $PROJECT wskazuje katalog główny Twojego projektu, a $NDK wskazuje katalog główny Ścieżka instalacji NDK.

Gdy wywołujesz funkcję ndk-gdb, konfiguruje ona sesję wyszukiwania plików źródłowych oraz wersji symboli i debugowania wygenerowanych bibliotek natywnych. Po podłączeniu do procesu aplikacji, ndk-gdb zwraca serię komunikatów o błędach i informuje, że nie może znajdziesz różne biblioteki systemowe. Jest to normalne, ponieważ host nie zawiera symboli/debugowania wersji tych bibliotek na urządzeniu docelowym. Możesz to bezpiecznie zignorować wiadomości.

Następnie ndk-gdb wyświetla zwykły prompt GDB.

Z ndk-gdb możesz korzystać w taki sam sposób jak w GNU GDB. Możesz na przykład: użyj b <location>, aby ustawić punkty przerwania, a c (aby kontynuować), wznów wykonanie zadania. Pełną listę poleceń znajdziesz w Instrukcja obsługi GDB. Jeśli wolisz używać Debuger LLDB, użyj --lldb przy wywoływaniu skryptu ndk-gdb.

Pamiętaj, że po zamknięciu promptu GDB proces aplikacji, który debugujesz, zostanie zatrzymany. Ten jest ograniczeniem GDB.

ndk-gdb obsługuje wiele warunków błędów i wyświetla informacyjne komunikaty o błędach, jeśli znajduje problem. weryfikacje te obejmują sprawdzenie, czy spełnione są te warunki:

  • Sprawdza, czy na ścieżce jest ADB.
  • Sprawdza, czy w pliku manifestu aplikacji zadeklarowano możliwość debugowania.
  • Sprawdza, czy na urządzeniu zainstalowana aplikacja o tej samej nazwie pakietu jest również .

Domyślnie ndk-gdb wyszukuje uruchomiony proces aplikacji i wyświetla komunikat jeśli go nie znajdzie. Możesz jednak użyć usługi --start lub --launch=<name>, aby automatycznie rozpoczynać aktywność przed debugowaniem . Więcej informacji znajdziesz w artykule Opcje.

Opcje

Aby zobaczyć pełną listę opcji, wpisz ndk-gdb --help w wierszu poleceń. Tabela 1 pokazuje kilka najczęściej używanych linków wraz z krótkimi opisami.

Tabela 1. Typowe opcje ndk-gdb i ich opisy.

Od ndk-gdb z tą opcją uruchamia pierwsze dostępne działanie na liście w manifeście aplikacji. Użyj polecenia --launch=<name>, aby uruchomić następny możliwy do uruchomienia element działania. Aby skopiować listę działań możliwych do uruchomienia, uruchom --launch-list z poziomu polecenia .

Option Opis>
--lldb

Jeśli jest ustawiony, skrypt zamiast gdb będzie używać na potrzeby sesji debugera LLDB.

--verbose

Ta opcja informuje system kompilacji, że ma wydrukować szczegółowe informacje o debugowaniu natywnym konfiguracji sesji. Jest to konieczne tylko w przypadku rozwiązywania problemów, gdy debuger nie może połączyć się z aplikacji i komunikaty o błędach wyświetlane przez ndk-gdb nie wystarczą.

--force Domyślnie ndk-gdb przerywa działanie, jeśli wykryje, że inna sesja debugowania natywnego została już przeprowadzona które działają na tym samym urządzeniu. Ta opcja kończy drugą sesję i zastępuje ją nową. Pamiętaj, że ta opcja nie powoduje zakończenia debugowania debugowanej aplikacji – musisz ją wyłączyć. oddzielnie.
--start

Po uruchomieniu ndk-gdb domyślnie próbuje podłączyć się do istniejącej instancji instancji aplikację na urządzeniu docelowym. To domyślne działanie możesz zastąpić, używając parametru --start do wyraźnie uruchomić aplikację na urządzeniu docelowym przed sesją debugowania.

--launch=<name>

Ta opcja jest podobna do --start, z tą różnicą, że pozwala uruchomić określoną aktywność w aplikacji. Ta funkcja jest przydatna tylko wtedy, gdy plik manifestu określa wiele które można uruchomić.

--launch-list

Ta wygodna opcja umożliwia wydrukowanie listy wszystkich nazw działań możliwych do uruchomienia w manifestu aplikacji. --start używa nazwy pierwszej aktywności.

--project=<path> Ta opcja określa katalog projektu aplikacji. Przydaje się, jeśli chcesz uruchomić w dowolnym momencie bez konieczności przechodzenia do katalogu projektu.
--port=<port>

Domyślnie ndk-gdb używa lokalnego portu TCP 5039 do komunikacji z aplikacją jest debugowany na urządzeniu docelowym. Użycie innego portu umożliwia natywne debugowanie programów działające na różnych urządzeniach lub w emulatorach podłączonych do tego samego hosta.

--adb=<file>

Ta opcja określa parametr adb . Jest to konieczne tylko wtedy, gdy nie ustawiono ścieżki obejmującej dany plik wykonywalny.

  • -d
  • -e
  • -s <serial>
  • Te flagi są podobne do poleceń adb o tych samych nazwach. Ustaw te flagi, jeśli masz kilka urządzeń lub emulatorów podłączonych do hosta. Ich znaczenie jest następujące:

    -d
    Połącz się z jednym urządzeniem fizycznym.
    -e
    Połącz się z jednym urządzeniem z emulatorem.
    -s <serial>
    Połącz się z określonym urządzeniem lub emulatorem. <serial> to nazwa urządzenia zgodnie z informacjami podanymi w poleceniu adb devices.

    Możesz też zdefiniować zmienną środowiskową ADB_SERIAL, aby wymienić bez konieczności wyboru konkretnej opcji.

  • --exec=<file>
  • -x <file>
  • Dzięki tej opcji ndk-gdb może uruchamiać polecenia inicjujące GDB znajdujące się w <file> po połączeniu z procesem, który debuguje. Jest to przydatna funkcja, jeśli: chcesz zrobić coś wielokrotnie, np. skonfigurować listę punktów przerwania, a następnie wznowić podczas automatycznego uruchamiania.

    --nowait

    Wyłącz wstrzymywanie kodu Java do czasu połączenia z GDB. Pominięcie tej opcji może spowodować, że debuger aby przegapić początkowe punkty przerwania.

    --tui -t

    Włącz tekstowy interfejs użytkownika, jeśli jest dostępny.

    --gnumake-flag=<flag>

    Ta opcja to dodatkowa flaga przekazywane do ndk-build, gdy i wysyła zapytania o informacje o projekcie. Możesz użyć wielu wystąpień tej opcji w to samo polecenie.

    Uwaga: ostatnie 3 opcje w tej tabeli dotyczą tylko Wersja Pythona instancji ndk-gdb.

    Obsługa wątków

    Jeśli Twoja aplikacja działa na platformie starszej niż Android 2.3 (poziom interfejsu API 9): ndk-gdb nie może prawidłowo debugować wątków natywnych. Debuger może tylko debugować tylko wątek główny, całkowicie abd ignoruje wykonanie innych wątków.

    Jeśli umieścisz punkt przerwania w funkcji wykonanej w wątku innym niż główny, program wyjdzie, a funkcja GDB wyświetli ten komunikat:

    Program terminated with signal SIGTRAP, Trace/breakpoint trap.
          The program no longer exists.