Udostępnij za pośrednictwem


GDB

Omówienie

Platforma Xamarin.Android 4.10 wprowadziła częściową obsługę użycia gdb przy użyciu _Gdb elementu docelowego MSBuild.

Uwaga

gdb obsługa wymaga zainstalowania zestawu Android NDK.

Istnieją trzy sposoby używania polecenia gdb:

  1. Debugowanie kompilacji z włączonym szybkim wdrażaniem.
  2. Debugowanie kompilacji przy wyłączonym szybkim wdrożeniu.
  3. Kompilacje wydania .

Jeśli coś pójdzie nie tak, zobacz sekcję Rozwiązywanie problemów .

Debugowanie kompilacji za pomocą szybkiego wdrażania

Podczas kompilowania i wdrażania kompilacji debugowania z włączonym gdb szybkim wdrażaniem można dołączyć przy użyciu _Gdb obiektu docelowego MSBuild.

Najpierw zainstaluj aplikację. Można to zrobić za pośrednictwem środowiska IDE lub za pośrednictwem wiersza polecenia:

$ /Library/Frameworks/Mono.framework/Commands/xbuild /t:Install *.csproj

Po drugie uruchom element docelowy _Gdb . Po zakończeniu wykonywania gdb zostanie wydrukowany wiersz polecenia:

$ /Library/Frameworks/Mono.framework/Commands/xbuild /t:_Gdb *.csproj
...
    Target _Gdb:
        "/opt/android/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb" -x "/Users/jon/Development/Projects/Scratch.HelloXamarin20//gdb-symbols/gdb.env"
...

Element _Gdb docelowy uruchomi dowolne działanie uruchamiania zadeklarowane w AndroidManifest.xml pliku. Aby jawnie określić działanie do uruchomienia, użyj RunActivity właściwości MSBuild. Uruchamianie usług i innych konstrukcji systemu Android nie jest obecnie obsługiwane.

Obiekt _Gdb docelowy gdb-symbols utworzy katalog i skopiuje tam zawartość /system/lib katalogu docelowego i $APPDIR/lib katalogów.

Uwaga

Zawartość gdb-symbols katalogu jest powiązana z wdrożonym elementem docelowym systemu Android i nie zostanie automatycznie zamieniona, jeśli zmienisz element docelowy. (Rozważ to usterkę). Jeśli zmienisz urządzenia docelowe z systemem Android, musisz ręcznie usunąć ten katalog.

Na koniec skopiuj wygenerowane gdb polecenie i wykonaj je w powłoce:

$ "/opt/android/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb" -x "/Users/jon/Development/Projects/Scratch.HelloXamarin20//gdb-symbols/gdb.env"
GNU gdb (GDB) 7.3.1-gg2
...
(gdb) bt
#0  0x40082e84 in nanosleep () from /Users/jon/Development/Projects/Scratch.HelloXamarin20/gdb-symbols/libc.so
#1  0x4008ffe6 in sleep () from /Users/jon/Development/Projects/Scratch.HelloXamarin20/gdb-symbols/libc.so
#2  0x74e46240 in ?? ()
#3  0x74e46240 in ?? ()
(gdb) c

Debugowanie kompilacji bez szybkiego wdrażania

Debugowanie kompilacji za pomocą szybkiego wdrażania działa przez skopiowanie programu NDK gdbserver systemu Android do katalogu szybkiego wdrażania .__override__ . Gdy szybkie wdrażanie jest wyłączone, ten katalog może nie istnieć.

Istnieją dwa obejścia:

  • Ustaw właściwość systemową debug.mono.log , .__override__ aby katalog został utworzony.
  • Uwzględnij w elemecie gdbserver.apk.

Ustawianie właściwości systemowej debug.mono.log

Aby ustawić debug.mono.log właściwość system, użyj adb polecenia :

$ adb shell setprop debug.mono.log gc

Po ustawieniu właściwości systemowej wykonaj _Gdb element docelowy i wydrukowane gdb polecenie, tak jak w przypadku kompilacji debugowania z konfiguracją szybkiego wdrażania:

$ /Library/Frameworks/Mono.framework/Commands/xbuild /t:_Gdb *.csproj
  ...
    Target _Gdb:
        "/opt/android/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb" -x "/Users/jon/Development/Projects/Scratch.HelloXamarin20//gdb-symbols/gdb.env"
  ...
$ "/opt/android/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb" -x "/Users/jon/Development/Projects/Scratch.HelloXamarin20//gdb-symbols/gdb.env"
GNU gdb (GDB) 7.3.1-gg2
...
(gdb) c

Dołączanie gdbserver do aplikacji

Aby uwzględnić gdbserver w aplikacji:

  1. Znajdź gdbserver plik NDK systemu Android (powinien znajdować się w katalogu $ANDROID_NDK_PATH/prebuilt/android-arm/gdbserver/gdbserver) i skopiuj go do katalogu projektu.

  2. Zmień nazwę gdbserver na libs/armeabi-v7a/libgdbserver.so.

  3. Dodaj biblioteki libs/armeabi-v7a/libgdbserver.so do projektu za pomocą akcji Kompilacja .AndroidNativeLibrary

  4. Ponownie skompiluj i ponownie zainstaluj aplikację.

Po ponownym zainstalowaniu aplikacji wykonaj _Gdb element docelowy i wydrukowane gdb polecenie, tak jak w przypadku kompilacji debugowania z konfiguracją szybkiego wdrażania:

$ /Library/Frameworks/Mono.framework/Commands/xbuild /t:_Gdb *.csproj
  ...
    Target _Gdb:
        "/opt/android/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb" -x "/Users/jon/Development/Projects/Scratch.HelloXamarin20//gdb-symbols/gdb.env"
  ...
$ "/opt/android/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb" -x "/Users/jon/Development/Projects/Scratch.HelloXamarin20//gdb-symbols/gdb.env"
GNU gdb (GDB) 7.3.1-gg2
...
(gdb) c

Kompilacje wydania

gdb obsługa wymaga trzech rzeczy:

  1. Uprawnienie INTERNET .
  2. Włączono debugowanie aplikacji.
  3. gdbserverDostępny element .

Uprawnienie INTERNET jest domyślnie włączone w obszarze Debugowanie aplikacji. Jeśli aplikacja nie jest jeszcze obecna, możesz ją dodać, edytując właściwości/AndroidManifest.xml lub edytując właściwości projektu.

Debugowanie aplikacji można włączyć, ustawiając właściwość atrybutu niestandardowego ApplicationAttribute.Debugowanie na , lub edytując właściwości/AndroidManifest.xml i ustawiając //application/@android:debuggable atrybut na true:true

<application android:label="Example.Name.Here" android:debuggable="true">

gdbserver Dostęp można udostępnić, postępując zgodnie z sekcją Debugowanie kompilacji bez szybkiego wdrażania.

Jedna zmarszczka: docelowy _Gdb program MSBuild zabije wszystkie wcześniej uruchomione wystąpienia aplikacji. Nie będzie to działać w przypadku obiektów docelowych w wersji 4.0 systemu Android.

Rozwiązywanie problemów

mono_pmip nie działa

Funkcja (przydatna mono_pmip do uzyskiwania zarządzanych ramek stosu) jest eksportowana z libmonosgen-2.0.soelementu , którego _Gdb obiekt docelowy nie jest obecnie ściągany. (Zostanie to naprawione w przyszłej wersji).

Aby włączyć funkcje wywołujące znajdujące się w programie libmonosgen-2.0.so, skopiuj je z urządzenia docelowego do gdb-symbols katalogu:

$ adb pull /data/data/Mono.Android.DebugRuntime/lib/libmonosgen-2.0.so Project/gdb-symbols

Następnie uruchom ponownie sesję debugowania.

Błąd magistrali: 10 podczas uruchamiania gdb polecenia

Gdy polecenie powoduje wystąpienie błędu gdb z "Bus error: 10"poleceniem , uruchom ponownie urządzenie z systemem Android.

$ "/path/to/arm-linux-androideabi-gdb" -x "Project/gdb-symbols/gdb.env"
GNU gdb (GDB) 7.3.1-gg2
Copyright (C) 2011 Free Software Foundation, Inc.
...
Bus error: 10
$

Brak śladu stosu po dołączeniu

$ "/path/to/arm-linux-androideabi-gdb" -x "Project/gdb-symbols/gdb.env"
GNU gdb (GDB) 7.3.1-gg2
Copyright (C) 2011 Free Software Foundation, Inc.
...
(gdb) bt
No stack.

Zazwyczaj jest to znak, że zawartość gdb-symbols katalogu nie jest synchronizowana z elementem docelowym systemu Android. (Czy zmieniono element docelowy systemu Android?)

Usuń gdb-symbols katalog i spróbuj ponownie.