GDB

Genel bakış

Xamarin.Android 4.10, MSBuild hedefini kullanarak kullanımı gdb için _Gdb kısmi destek kullanıma sunulmuştur.

Not

gdb desteği, Android NDK'nin yüklenmesini gerektirir.

kullanmanın gdbüç yolu vardır:

  1. Hızlı Dağıtım özellikli derlemelerde hata ayıklama.
  2. Hızlı Dağıtım devre dışı bırakılmış derlemelerde hata ayıklama.
  3. Yayın derlemeleri .

Sorun oluştuğunda lütfen Sorun Giderme bölümüne bakın.

Hızlı Dağıtım ile Derlemelerde Hata Ayıklama

Hızlı Dağıtım etkin bir Hata Ayıklama derlemesi oluştururken ve dağıtırken, gdb MSBuild hedefi kullanılarak _Gdb eklenebilir.

İlk olarak uygulamayı yükleyin. Bu, IDE aracılığıyla veya komut satırı aracılığıyla yapılabilir:

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

İkinci olarak, hedefi çalıştırın _Gdb . Yürütmenin sonunda bir gdb komut satırı yazdırılır:

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

Hedef, _Gdb dosyanızda AndroidManifest.xml bildirilen rastgele bir başlatıcı Etkinliği başlatır. Hangi Etkinliğin çalıştırılacağını açıkça belirtmek için MSBuild özelliğini kullanın RunActivity . Hizmetleri ve diğer Android yapılarını başlatmak şu anda desteklenmiyor.

Hedef _Gdb bir gdb-symbols dizin oluşturur ve hedefinizin /system/lib ve $APPDIR/lib dizinlerinizin içeriğini oraya kopyalar.

Not

Dizinin içeriği gdb-symbols dağıtılan Android hedefine bağlıdır ve hedefi değiştirmeniz durumunda otomatik olarak değiştirilmez. (Bunu bir hata olarak düşünün.) Android hedef cihazlarını değiştirirseniz bu dizini el ile silmeniz gerekir.

Son olarak, oluşturulan gdb komutu kopyalayın ve kabuğunuzda yürütür:

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

Hızlı Dağıtım Olmadan Derlemelerde Hata Ayıklama

Hızlı Dağıtım ile derlemelerde hata ayıklama, Android NDK'nin gdbserver programını Hızlı Dağıtım .__override__ dizinine kopyalayarak çalışır. Hızlı Dağıtım devre dışı bırakıldığında, bu dizin mevcut olmayabilir.

İki geçici çözüm vardır:

  • debug.mono.log Sistem özelliğini dizinin oluşturulacak şekilde .__override__ ayarlayın.
  • içine .apkekleyingdbserver.

debug.mono.log Sistem Özelliğini Ayarlama

Sistem özelliğini ayarlamak debug.mono.log için komutunu adb kullanın:

$ adb shell setprop debug.mono.log gc

Sistem özelliği ayarlandıktan sonra, Hızlı Dağıtım ile Derleme hatalarını ayıklama yapılandırmasında olduğu gibi hedefi ve yazdırılan gdb komutu yürütebilirsiniz_Gdb:

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

Uygulamanıza dahil gdbserver

Uygulamanızın içine eklemek gdbserver için:

  1. Android NDK'nizin içinde bulun gdbserver ($ANDROID_NDK_PATH/prebuilt/android-arm/gdbserver/gdbserver içinde olmalıdır) ve project dizininize kopyalayın.

  2. libs/armeabi-v7a/libgdbserver.so olarak yeniden adlandırıngdbserver.

  3. Derleme eylemiyleAndroidNativeLibraryprojenize libs/armeabi-v7a/libgdbserver.so ekleyin.

  4. Uygulamanızı yeniden derleyin ve yeniden yükleyin.

Uygulama yeniden yüklendikten sonra, Hızlı Dağıtım ile Derlemelerde Hata Ayıklama yapılandırmasında olduğu gibi hedefi ve yazdırılan gdb komutu yürütebilirsiniz_Gdb:

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

Yayın Derlemeleri

gdb destek için üç şey gerekir:

  1. İzin INTERNET .
  2. Uygulama Hata Ayıklama etkinleştirildi.
  3. Erişilebilir gdbserverbir .

INTERNET İzin, Hata ayıklama uygulamalarında varsayılan olarak etkindir. Uygulamanızda henüz yoksa, Özellikler/AndroidManifest.xml düzenleyerek veya Proje Özelliklerini düzenleyerek ekleyebilirsiniz.

Uygulama hata ayıklama, ApplicationAttribute.Debugging özel özniteliği özelliği olarak trueayarlanarak veya Özellikler/AndroidManifest.xml düzenlenerek ve özniteliği trueolarak //application/@android:debuggable ayarlanarak etkinleştirilebilir:

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

Hızlı Dağıtım Olmadan Derlemelerde Hata Ayıklama bölümü izlenerek erişilebilir gdbserver bir kaynak sağlanabilir.

Bir kırışıklık: _Gdb MSBuild hedefi, daha önce çalışan tüm uygulama örneklerini öldürür. Bu, Android öncesi v4.0 hedeflerinde çalışmaz.

Sorun giderme

mono_pmip çalışmıyor

mono_pmip İşlev (yönetilen yığın çerçeveleri elde etmek için kullanışlıdır), hedef tarafından şu anda aşağı çekilmeyen 'den libmonosgen-2.0.so_Gdb dışarı aktarılır. (Bu, gelecek bir sürümde düzeltilecektir.)

içinde libmonosgen-2.0.sobulunan çağrı işlevlerini etkinleştirmek için hedef cihazdan dizinine gdb-symbols kopyalayın:

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

Ardından hata ayıklama oturumunuzu yeniden başlatın.

Bus hatası: Komutu çalıştırırken gdb 10

gdb komutunda "Bus error: 10"hata olduğunda Android cihazını yeniden başlatın.

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

Eklemeden sonra yığın izlemesi yok

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

Bu genellikle dizinin içeriğinin gdb-symbols Android hedefinizle eşitlenmediğini gösteren bir işarettir. (Android hedefinizi değiştirdiniz mi?)

Lütfen dizini silin gdb-symbols ve yeniden deneyin.