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:

  1. Hızlı Dağıtım etkinken derlemelerde hata ayıklama.
  2. Hızlı Dağıtım devre dışı bırakılmış derlemelerde hata ayıklama.
  3. 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.log oluşturulacak şekilde sistem .__override__ özelliğini ayarlayın.
  • içinde gdbserver yer 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:

  1. gdbserverAndroid NDK'nizin içinde bulun gdbserveriçinde olmalıdır) ve bunu Project dizinine kopyalayın.

  2. gdbservergdbserver

  3. derlemenize libs/armeabi-v7a/libgdbserver.so Project derleme eylemiyle ekleyin.

  4. 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:

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

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.