Ndk-Gdb

NDK zawiera skrypt powłoki o nazwie ndk-gdb, który umożliwia rozpoczęcie sesji debugowania na poziomie jądra za pomocą wiersza poleceń (wcześniej używano do tego polecenia gdb, ale teraz lldb). Użytkownicy, którzy wolą korzystać z interfejsu graficznego, powinni zapoznać się z dokumentacją dotyczącą debugowania w Android Studio.

Wymagania

Aby debugowanie na poziomie wiersza poleceń działało prawidłowo, musisz spełnić te wymagania:

  • Utwórz aplikację za pomocą skryptu ndk-build. Skrypt ndk-gdb nie obsługuje kompilacji za pomocą starszej metody make APP=<name>.
  • Aby włączyć debugowanie aplikacji w pliku AndroidManifest.xml, dodaj element <application>, który ustawia atrybut android:debuggable na wartość true.
  • Utwórz aplikację, która będzie działać na Androidzie 2.2 (Android API na poziomie 8) lub nowszym.
  • Debugowanie na urządzeniu lub emulatorze z Androidem 2.2 lub nowszym. Na potrzeby debugowania nie ma znaczenia docelowy poziom interfejsu API zadeklarowany w pliku AndroidManifest.xml.
  • Tworzenie aplikacji w powłoce Unix. W systemie Windows użyj Cygwin lub eksperymentalnej ndk-gdb-py implementacji Pythona.
  • Użyj GNU Make w wersji 3.81 lub nowszej.

Wykorzystanie

Aby wywołać skrypt ndk-gdb, przejdź do katalogu aplikacji lub dowolnego katalogu w jego obrębie. Przykład:

cd $PROJECT
$NDK/ndk-gdb

Tutaj $PROJECT wskazuje katalog główny projektu, a $NDK – ścieżkę do instalacji NDK.

Gdy wywołasz ndk-gdb, sesja jest konfigurowana tak, aby szukać plików źródłowych i wersji symbolicznych/debugowych wygenerowanych bibliotek natywnych. Po pomyślnym dołączeniu do procesu aplikacji ndk-gdb wyświetla długą serię komunikatów o błędach, w których informuje, że nie może znaleźć różnych bibliotek systemowych. Jest to normalne, ponieważ maszyna hosta nie zawiera wersji tych bibliotek z symbolami ani wersji debugowania na urządzeniu docelowym. Możesz zignorować te wiadomości.

Następnie ndk-gdb wyświetla zwykły wiersz poleceń lldb.

Interakcje z ndk-gdb są takie same jak w przypadku lldb. Jeśli nie znasz LLDB, ale znasz GDB, zapoznaj się z [mapą poleceń GDB na LLDB](https://lldb.llvm.org/use/map.html).

ndk-gdb obsługuje wiele warunków błędu i wyświetla komunikat o błędzie, jeśli znajdzie problem. Te kontrole obejmują sprawdzenie, czy spełnione są te warunki:

  • Sprawdzanie, czy ADB znajduje się na ścieżce.
  • Sprawdzanie, czy aplikacja jest deklarowana jako debugowana w pliku manifestu.
  • Sprawdza, czy zainstalowana aplikacja o tej samej nazwie pakietu jest też dostępna do debugowania na urządzeniu.

Domyślnie ndk-gdb wyszukuje proces aplikacji, który jest już uruchomiony, a jeśli go nie znajdzie, wyświetla błąd. Możesz jednak użyć opcji --start lub --launch=<name>, aby automatycznie uruchomić aktywność przed sesją debugowania. Więcej informacji znajdziesz w sekcji Opcje.

Opcje

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

Tabela 1. Typowe opcje ndk-gdb i ich opisy

Uruchomienie ndk-gdb z tą opcją powoduje uruchomienie pierwszej aktywności, która może być uruchomiona w pliku manifestu aplikacji. Aby rozpocząć następną aktywność, kliknij --launch=<name>. Aby wygenerować listę aktywnych działań, uruchom --launch-list w wierszu poleceń.

Option Opis>
--verbose

Ta opcja informuje system kompilacji, aby wyświetlał szczegółowe informacje o konfiguracji sesji debugowania natywnego. Jest to konieczne tylko w przypadku problemów z debugowaniem, gdy debuger nie może połączyć się z aplikacją, a komunikaty o błędach wyświetlane przez ndk-gdb są niewystarczające.

--force Domyślnie ndk-gdb przerywa działanie, jeśli wykryje, że na tym samym urządzeniu jest już uruchomiona inna natywnych sesja debugowania. Ta opcja kończy działanie innej sesji i zastępuje ją nową. Pamiętaj, że ta opcja nie zabija rzeczywistej aplikacji, która jest debugowana. Musisz ją zabić osobno.
--start

Gdy uruchamiasz ndk-gdb, domyślnie próbuje ona dołączyć do uruchomionego już wystąpienia aplikacji na urządzeniu docelowym. Możesz zmienić to domyślne zachowanie, używając --start, aby przed sesją debugowania wyraźnie uruchomić aplikację na urządzeniu docelowym.

--launch=<name>

Ta opcja jest podobna do opcji --start, z tym wyjątkiem, że umożliwia uruchomienie określonej aktywności z aplikacji. Ta funkcja jest przydatna tylko wtedy, gdy manifest definiuje wiele aktywnych działań.

--launch-list

Ta wygodna opcja umożliwia wydrukowanie listy wszystkich nazw aktywnych aktywności znalezionych w pliku manifestu aplikacji. --start używa nazwy pierwszej aktywności.

--project=<path> Ta opcja określa katalog projektu aplikacji. Jest to przydatne, jeśli chcesz uruchomić skrypt, nie przechodząc najpierw do katalogu projektu.
--port=<port>

Domyślnie ndk-gdb używa lokalnego portu TCP 5039 do komunikacji z aplikacją, którą debuguje na urządzeniu docelowym. Korzystanie z innego portu umożliwia debugowanie programów na różnych urządzeniach lub emulatorach połączonych z tym samym komputerem-hostem.

--adb=<file>

Ta opcja określa plik wykonywalny adb. Jest to konieczne tylko wtedy, gdy ścieżka nie zawiera pliku wykonywalnego.

  • -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 połączonych z hostem. Ich znaczenie jest następujące:

    -d
    Połącz się z jednym urządzeniem fizycznym.
    -e
    Połącz się z jednym urządzeniem emulatora.
    -s <serial>
    Połącz się z konkretnym urządzeniem lub emulatorem. Tutaj <serial> to nazwa urządzenia wyświetlana w wyniku polecenia adb devices.

    Możesz też zdefiniować zmienną środowiskową ADB_SERIAL, aby wyświetlić listę urządzeń bez konieczności wybierania konkretnej opcji.

  • --exec=<file>
  • -x <file>
  • Ta opcja informuje ndk-gdb, aby po nawiązaniu połączenia z debuggowanym procesem uruchomiła polecenia inicjalizacji debugera znajdujące się w pliku <file>. Ta funkcja jest przydatna, jeśli chcesz coś robić wielokrotnie, np. tworzyć listę punktów przerwania, a potem automatycznie wznawiać wykonywanie programu.

    --nowait

    Wyłącz pauzowanie kodu Java do czasu połączenia z debugerem. Podanie tej opcji może spowodować, że debuger nie zauważy punktów przerwania na początku.

    --tui -t

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

    --gnumake-flag=<flag>

    Ta opcja to dodatkowa flaga (lub flagi), która jest przekazywana do systemu ndk-build podczas wysyłania do niego zapytania o informacje o projekcie. W tym samym poleceniu możesz użyć kilku wystąpień tej opcji.

    Uwaga: 3 ostatnie opcje w tej tabeli dotyczą tylko wersji ndk-gdb w Pythonie.