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
:
- Debugowanie kompilacji z włączonym szybkim wdrażaniem.
- Debugowanie kompilacji przy wyłączonym szybkim wdrożeniu.
- 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:
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.Zmień nazwę
gdbserver
na libs/armeabi-v7a/libgdbserver.so.Dodaj biblioteki libs/armeabi-v7a/libgdbserver.so do projektu za pomocą akcji Kompilacja .
AndroidNativeLibrary
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:
- Uprawnienie
INTERNET
. - Włączono debugowanie aplikacji.
gdbserver
Dostę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.so
elementu , 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.