Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz 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ź
gdbserverplik NDK systemu Android (powinien znajdować się w katalogu $ANDROID_NDK_PATH/prebuilt/android-arm/gdbserver/gdbserver) i skopiuj go do katalogu projektu.Zmień nazwę
gdbserverna libs/armeabi-v7a/libgdbserver.so.Dodaj biblioteki libs/armeabi-v7a/libgdbserver.so do projektu za pomocą akcji Kompilacja .
AndroidNativeLibraryPonownie 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.
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.