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:
- Hızlı Dağıtım özellikli derlemelerde hata ayıklama.
- Hızlı Dağıtım devre dışı bırakılmış derlemelerde hata ayıklama.
- 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
.apk
ekleyingdbserver
.
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:
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.libs/armeabi-v7a/libgdbserver.so olarak yeniden adlandırın
gdbserver
.Derleme eylemiyle
AndroidNativeLibrary
projenize libs/armeabi-v7a/libgdbserver.so ekleyin.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:
- İzin
INTERNET
. - Uygulama Hata Ayıklama etkinleştirildi.
- Erişilebilir
gdbserver
bir .
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 true
ayarlanarak veya Özellikler/AndroidManifest.xml düzenlenerek ve özniteliği true
olarak //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.so
bulunan ç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.