Sdílet prostřednictvím


GDB

Přehled

Xamarin.Android 4.10 zavedl částečnou podporu pro použití gdb pomocí _Gdb cíle NÁSTROJE MSBuild.

Poznámka:

gdb podpora vyžaduje instalaci sady Android NDK.

Existují tři způsoby použití gdb:

  1. Ladění buildů s povoleným rychlým nasazením
  2. Ladění buildů se zakázaným rychlým nasazením
  3. Vydané buildy .

Pokud se něco pokazí, projděte si část Řešení potíží .

Ladění sestavení s využitím rychlého nasazení

Při sestavování a nasazování sestavení ladění s povoleným gdb rychlým nasazením je možné ho připojit pomocí _Gdb cíle NÁSTROJE MSBuild.

Nejprve nainstalujte aplikaci. Můžete to provést prostřednictvím integrovaného vývojového prostředí (IDE) nebo přes příkazový řádek:

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

Za druhé spusťte _Gdb cíl. Na konci spuštění gdb se vytiskne příkazový řádek:

$ /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"
...

Cíl _Gdb spustí libovolnou aktivitu spouštěče deklarovanou v souboru AndroidManifest.xml . Chcete-li explicitně určit, která aktivita se má spustit, použijte RunActivity vlastnost MSBuild. Spuštění služeb a dalších konstruktorů Androidu se v tuto chvíli nepodporuje.

Cíl _Gdb vytvoří gdb-symbols adresář a zkopíruje obsah adresářů a $APPDIR/lib adresářů cíle/system/lib.

Poznámka:

Obsah gdb-symbols adresáře je svázaný s cílem Androidu, na který jste nasadili, a nebude automaticky nahrazen, pokud změníte cíl. (Zvažte tuto chybu.) Pokud změníte cílová zařízení s Androidem, budete muset tento adresář odstranit ručně.

Nakonec zkopírujte vygenerovaný gdb příkaz a spusťte ho v prostředí:

$ "/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

Ladění sestavení bez rychlého nasazení

Ladění buildů s rychlým nasazením funguje zkopírováním programu sady Android NDK gdbserver do adresáře Rychlé nasazení .__override__ . Pokud je rychlé nasazení zakázané, nemusí tento adresář existovat.

Existují dvě alternativní řešení:

  • Nastavte systémovou debug.mono.log vlastnost tak, aby .__override__ byl adresář vytvořen.
  • Zahrnout gdbserver do svého .apk.

debug.mono.log Nastavení systémové vlastnosti

K nastavení debug.mono.log systémové vlastnosti použijte adb příkaz:

$ adb shell setprop debug.mono.log gc

Jakmile je vlastnost systému nastavená, spusťte _Gdb cíl a tištěný gdb příkaz jako u sestavení ladění s konfigurací Rychlé nasazení:

$ /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

Zahrnutí gdbserver do aplikace

gdbserver Zahrnutí do aplikace:

  1. Vyhledejte gdbserver sadu Android NDK (měla by být v $ANDROID_NDK_PATH/prebuilt/android-arm/gdbserver/gdbserver/gdbserver) a zkopírujte ji do adresáře Projectu.

  2. Přejmenujte gdbserver na libs/armeabi-v7a/libgdbserver.so.

  3. Přidejte do projektu libs/armeabi-v7a/libgdbserver.so pomocí akceAndroidNativeLibrarysestavení .

  4. Znovu sestavte a znovu nainstalujte aplikaci.

Po přeinstalaci aplikace spusťte _Gdb cíl a tištěný gdb příkaz jako u sestavení ladění s konfigurací Rychlé nasazení:

$ /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

Sestavení pro vydání

gdb podpora vyžaduje tři věci:

  1. Oprávnění INTERNET .
  2. Ladění aplikací je povolené.
  3. Přístupná gdbserver.

Oprávnění INTERNET je ve výchozím nastavení povolené v ladicích aplikacích. Pokud v aplikaci ještě není, můžete ji přidat úpravou vlastností/AndroidManifest.xml nebo úpravou vlastností projektu.

Ladění aplikací lze povolit nastavením vlastnosti vlastního atributu ApplicationAttribute.Debugging na truehodnotu nebo úpravou vlastností/AndroidManifest.xml a nastavením atributu //application/@android:debuggable na true:

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

Přístupný přístup gdbserver může být poskytován pomocí ladění buildů bez rychlého nasazení oddílu.

Jedna vráska: _Gdb Cíl NÁSTROJE MSBuild zabije všechny dříve spuštěné instance aplikace. Nebude to fungovat na cílech před Androidem verze 4.0.

Řešení problému

mono_pmip Nefunguje

Funkce mono_pmip (užitečná pro získání rámců spravovaného zásobníku) se exportuje z , ze libmonosgen-2.0.sokteré _Gdb cíl aktuálně nepřetáhne. (To bude opraveno v budoucí verzi.)

Pokud chcete povolit volání funkcí umístěných v libmonosgen-2.0.soadresáři, zkopírujte je z cílového gdb-symbols zařízení do adresáře:

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

Potom restartujte ladicí relaci.

Chyba sběrnice: 10 při spuštění gdb příkazu

Když příkaz dojde k gdb chybě, "Bus error: 10"restartujte zařízení s Androidem.

$ "/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
$

Žádné trasování zásobníku po připojení

$ "/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.

Obvykle se jedná o znaménko, že obsah gdb-symbols adresáře není synchronizovaný s vaším cílem pro Android. (Změnili jste cíl Androidu?)

Odstraňte gdb-symbols adresář a zkuste to znovu.