Bagikan melalui


GDB

Gambaran Umum

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:

  1. Build debug dengan Penyebaran Cepat diaktifkan .
  2. Build debug dengan Penyebaran Cepat dinonaktifkan .
  3. Rilis build .

Ketika terjadi kesalahan, silakan lihat bagian Pemecahan Masalah.

Debug Build dengan Penyebaran Cepat

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 tanpa Penyebaran Cepat

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

debug.mono.log Mengatur Properti Sistem

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

Termasuk gdbserver di aplikasi Anda

Untuk menyertakan gdbserver dalam aplikasi Anda:

  1. Temukan gdbserver dalam Android NDK Anda (harus berada di $ANDROID_NDK_PATH/prebuilt/android-arm/gdbserver/gdbserver), dan salin ke direktori Project Anda.

  2. Ganti nama gdbserver menjadi libs/armeabi-v7a/libgdbserver.so.

  3. Tambahkan libs/armeabi-v7a/libgdbserver.so ke Proyek Anda dengan tindakan Build .AndroidNativeLibrary

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

Build Rilis

gdb dukungan membutuhkan tiga hal:

  1. Izinnya INTERNET .
  2. Penelusuran Kesalahan Aplikasi diaktifkan.
  3. 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.

Pemecahan Masalah

mono_pmip tidak berfungsi

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.

Kesalahan bus: 10 saat menjalankan gdb perintah

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
$

Tidak ada pelacakan tumpukan setelah melampirkan

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