GDB
Genel Bakış
Xamarin.Android 4.10, uygulama hedefi kullanılarak gdb kullanımı için kısmi MSBuild _Gdb sundu.
Not
gdb desteği, Android NDK'nin yüklü olması gerekir.
kullanmanın üç yolu gdb vardır:
- Hızlı Dağıtım etkinken derlemelerde hata ayıklama.
- Hızlı Dağıtım devre dışı bırakılmış derlemelerde hata ayıklama.
- Yayın derlemeleri.
Bir sorun olduğ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 etkinleştirilmiş bir Hata Ayıklama derlemesi derlemesi oluşturma ve dağıtma sırasında, MSBuild gdb_Gdb etkinleştirilmiş olabilir.
İ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 _Gdb çalıştırın. 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ız içinde bildirilen rastgele başlatıcı etkinliği AndroidManifest.xml başlatacak. Çalıştıracak Etkinliği açıkça belirtmek için MSBuild RunActivity kullanın. Hizmetleri ve diğer Android yapılarını başlatma şu anda desteklenmiyor.
Hedef _Gdb bir dizin gdb-symbols oluşturacak ve hedefle dizinlerinin /system/lib içeriğini orada $APPDIR/lib kopyalar.
Not
Dizinin içeriği, dağıtmış olduğunuz Android hedefine bağlanır ve hedefi değiştirmeniz gdb-symbols gerekirken otomatik olarak değişmez. (Bunu bir hata olarak düşünün.) Android hedef cihazlarını değiştirirsanız bu dizini el ile silmeniz gerekir.
Son olarak, oluşturulan komutu gdb kopyalayın ve kabuğunda yürütün:
$ "/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 işlemi, Android NDK'nin programını Hızlı Dağıtım dizinine kopyalayıp .__override__ çalışır. Hızlı Dağıtım devre dışı bırakılmıştır, bu dizin mevcut olmayabilir.
İki geçici çözüm vardır:
- Dizin
debug.mono.logoluşturulacak şekilde sistem.__override__özelliğini ayarlayın. - içinde
gdbserveryer alan.apk.
Sistem debug.mono.log Özelliğini Ayarlama
Sistem özelliğini debug.mono.log ayarlamak için komutunu adb kullanın:
$ adb shell setprop debug.mono.log gc
Sistem özelliği ayarlandıktan sonra, Hızlı Dağıtım yapılandırmasıyla Derlemelerde Hata Ayıklama ile olduğu gibi hedefi ve _Gdbgdb yazdırılan komutu yürütün:
$ /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 gdbserver dahil
Uygulamanıza gdbserver dahil etmek için:
gdbserverAndroid NDK'nizin içinde bulungdbserveriçinde olmalıdır) ve bunu Project dizinine kopyalayın.gdbservergdbserverderlemenize libs/armeabi-v7a/libgdbserver.so Project derleme eylemiyle ekleyin.
Uygulamanızı yeniden oluşturma ve yeniden yükleme.
Uygulama yeniden yük olduktan sonra, Hızlı Dağıtım yapılandırmasıyla Derlemelerde Hata Ayıklama ile olduğu gibi hedefi ve _Gdbgdb yazdırılan komutu yürütün:
$ /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 üç şey gerektirir:
INTERNETİzin.- Uygulama Hata Ayıklama etkinleştirildi.
- Erişilebilir
gdbserverbir .
Hata INTERNET ayıklama uygulamaları'da izin varsayılan olarak etkindir. Uygulamanıza zaten mevcutsa, Özellikler/AndroidManifest.xml düzenleyerek veya Project ebilirsiniz.
Uygulama hata ayıklama, ApplicationAttribute.Debugging özel öznitelik özelliğini olarak ayararak veya Properties/AndroidManifest.xmldüzenleyerek ve özniteliği olarak ayararak true etkinleştirilebilir:
<application android:label="Example.Name.Here" android:debuggable="true">
Hızlı Dağıtım gdbserver Olmadan Derlemelerde Hata Ayıklama gdbserver olabilir.
Tek bir tehdit: _Gdb MSBuild hedef, daha önce çalışan tüm uygulama örneklerini sonlar. Bu, Android öncesi v4.0 hedeflerde çalışmaz.
Sorun giderme
mono_pmip çalışmıyor
işlevi mono_pmip (yönetilen yığın mono_pmiphedefin şu anda aşağı çekme libmonosgen-2.0.so yaptığı _Gdb 'den dışarı aktarılır. (Bu, gelecekteki bir sürümde düzeltilecek.)
içinde bulunan çağırma işlevlerini etkinleştirmek libmonosgen-2.0.so 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 oturumlarınızı yeniden başlatın.
Veri veri merkezi hatası: Komutu çalıştırarak 10 gdb
komutu gdb ile hata verir "Bus error: 10" ve Android cihazı 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 hedefiniz ile eşitlenmedi işaretidir. (Android hedefini değiştirdiniz mi?)
Lütfen dizini gdb-symbols silin ve yeniden deneyin.