Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.