GDB
Xamarin.Android 4.10 memperkenalkan dukungan parsial untuk digunakan gdb
dengan menggunakan _Gdb
target MSBuild.
Catatan
gdb
dukungan mengharuskan Android NDK diinstal.
Ada tiga cara untuk menggunakan gdb
:
- Build debug dengan Penyebaran Cepat diaktifkan .
- Build debug dengan Penyebaran Cepat dinonaktifkan .
- Rilis build .
Ketika terjadi kesalahan, silakan lihat bagian Pemecahan Masalah.
Saat membangun dan menyebarkan build Debug dengan Penyebaran Cepat diaktifkan, gdb
dapat dilampirkan dengan menggunakan _Gdb
target MSBuild.
Pertama, instal aplikasi. Ini dapat dilakukan melalui IDE, atau melalui baris perintah:
$ /Library/Frameworks/Mono.framework/Commands/xbuild /t:Install *.csproj
Kedua, jalankan _Gdb
target. Pada akhir eksekusi, gdb
baris perintah akan dicetak:
$ /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"
...
Target _Gdb
akan meluncurkan Aktivitas peluncur arbitrer yang dideklarasikan dalam file Anda AndroidManifest.xml
. Untuk secara eksplisit menentukan Aktivitas mana yang akan dijalankan, gunakan RunActivity
properti MSBuild. Memulai Layanan dan konstruksi Android lainnya saat ini tidak didukung.
Target _Gdb
akan membuat gdb-symbols
direktori dan menyalin konten target /system/lib
dan $APPDIR/lib
direktori Anda di sana.
Catatan
Konten gdb-symbols
direktori terkait dengan target Android yang Anda sebarkan, dan tidak akan diganti secara otomatis jika Anda mengubah target. (Anggap ini bug.) Jika Anda mengubah perangkat target Android, Anda harus menghapus direktori ini secara manual.
Terakhir, salin perintah yang dihasilkan gdb
dan jalankan di shell Anda:
$ "/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
Debug build dengan Penyebaran Cepat beroperasi dengan menyalin program Android NDK gdbserver
ke direktori Penyebaran .__override__
Cepat. Ketika Penyebaran Cepat dinonaktifkan, direktori ini mungkin tidak ada.
Ada dua solusi:
- Atur
debug.mono.log
properti sistem sehingga.__override__
direktori dibuat. - Sertakan
gdbserver
dalam ..apk
Untuk mengatur debug.mono.log
properti sistem, gunakan adb
perintah :
$ adb shell setprop debug.mono.log gc
Setelah properti sistem diatur, jalankan _Gdb
target dan perintah yang dicetak gdb
, seperti halnya Build Debug dengan konfigurasi Penyebaran Cepat:
$ /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
Untuk menyertakan gdbserver
dalam aplikasi Anda:
Temukan
gdbserver
dalam Android NDK Anda (harus berada di $ANDROID_NDK_PATH/prebuilt/android-arm/gdbserver/gdbserver), dan salin ke direktori Project Anda.Ganti nama
gdbserver
menjadi libs/armeabi-v7a/libgdbserver.so.Tambahkan libs/armeabi-v7a/libgdbserver.so ke Proyek Anda dengan tindakan Build .
AndroidNativeLibrary
Bangun ulang dan instal ulang aplikasi Anda.
Setelah aplikasi diinstal ulang, jalankan _Gdb
target dan perintah yang dicetak gdb
, seperti halnya Build Debug dengan konfigurasi Penyebaran Cepat:
$ /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
gdb
dukungan membutuhkan tiga hal:
- Izinnya
INTERNET
. - Penelusuran Kesalahan Aplikasi diaktifkan.
- Dapat diakses
gdbserver
.
Izin INTERNET
diaktifkan secara default di aplikasi Debug. Jika belum ada di aplikasi, Anda dapat menambahkannya dengan mengedit Properti/AndroidManifest.xml atau dengan mengedit Properti Proyek.
Penelusuran kesalahan aplikasi dapat diaktifkan dengan mengatur properti atribut kustom ApplicationAttribute.Debugging ke true
, atau dengan mengedit Properti/AndroidManifest.xml dan mengatur //application/@android:debuggable
atribut ke true
:
<application android:label="Example.Name.Here" android:debuggable="true">
Akses dapat gdbserver
disediakan dengan mengikuti bagian Debug Build tanpa Penyebaran Cepat.
Satu kerutan: Target _Gdb
MSBuild akan membunuh instans aplikasi yang berjalan sebelumnya. Ini tidak akan berfungsi pada target pra-Android v4.0.
Fungsi mono_pmip
(berguna untuk mendapatkan bingkai tumpukan terkelola) diekspor dari libmonosgen-2.0.so
, yang _Gdb
saat ini tidak ditarik ke bawah target. (Ini akan diperbaiki dalam rilis mendatang.)
Untuk mengaktifkan fungsi panggilan yang terletak di libmonosgen-2.0.so
, salin dari perangkat target ke gdb-symbols
direktori:
$ adb pull /data/data/Mono.Android.DebugRuntime/lib/libmonosgen-2.0.so Project/gdb-symbols
Kemudian mulai ulang sesi penelusuran kesalahan Anda.
gdb
Saat perintah terjadi kesalahan dengan "Bus error: 10"
, hidupkan ulang perangkat Android.
$ "/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
$
$ "/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.
Ini biasanya merupakan tanda bahwa konten direktori tidak disinkronkan gdb-symbols
dengan target Android Anda. (Apakah Anda mengubah target Android Anda?)
Hapus direktori dan gdb-symbols
coba lagi.