GDB
Обзор
В Xamarin.Android версии 4.10 добавлена частичная поддержка применения gdb
через целевое устройство MSBuild _Gdb
.
Примечание.
Для поддержки gdb
необходимо установить Android NDK.
gdb
можно использовать тремя способами.
- Отладочная сборка с быстрым развертыванием.
- Отладочная сборка без быстрого развертывания.
- Сборки выпуска.
Если у вас возникли проблемы, переходите к разделу Устранение неполадок.
Отладочная сборка с быстрым развертыванием
При создании и развертывании отладочной сборки с быстрым развертыванием gdb
можно подключить с помощью целевого устройства MSBuild _Gdb
.
Прежде всего установите приложение. Это можно сделать в интегрированной среде разработки или с помощью командной строки:
$ /Library/Frameworks/Mono.framework/Commands/xbuild /t:Install *.csproj
Затем запустите целевое устройство _Gdb
. Завершив работу, он выведет командную строку для запуска 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"
...
Целевое устройство _Gdb
запустит произвольное действие запуска, которое объявлено в вашем файле AndroidManifest.xml
. Чтобы явным образом указать действие, используйте свойство MSBuild RunActivity
. Запуск службы и других конструкций Android в настоящее время не поддерживается.
Целевое устройство _Gdb
создаст каталог gdb-symbols
и скопирует в него содержимое каталогов /system/lib
и $APPDIR/lib
из целевого устройства.
Примечание.
Содержимое каталога gdb-symbols
связано с целевым устройством Android, в котором вы выполняете развертывание, и не будет автоматически заменяться при изменении целевого устройства. (Рассмотрим эту ошибку.) При изменении целевых устройств Android необходимо вручную удалить этот каталог.
И наконец, скопируйте созданную команду 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"
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
Отладочная сборка без быстрого развертывания
Отладочные сборки с быстрым развертыванием просто копируют программу gdbserver
Android NDK в каталог быстрого развертывания .__override__
. Если быстрое развертывание отключено, этот каталог может отсутствовать.
У вас есть два варианта обойти эту проблему.
- Задайте системное свойство
debug.mono.log
, чтобы создался каталог.__override__
. - Включите
gdbserver
в.apk
.
Настройка системного свойства debug.mono.log
Чтобы задать системное свойство debug.mono.log
, используйте команду adb
:
$ adb shell setprop debug.mono.log gc
Настроив значение системного свойства, запустите целевое устройство _Gdb
выполните созданную им команду 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
Добавление gdbserver
в приложение
Чтобы включить gdbserver
в приложение, выполните следующие действия.
Найдите
gdbserver
в android NDK (он должен находиться в $ANDROID_NDK_PATH/prebuilt/android-arm/gdbserver/gdbserver) и скопируйте его в каталог Project.Переименуйте
gdbserver
в libs/armeabi-v7a/libgdbserver.so.Добавьте libs/armeabi-v7a/libgdbserver.so в проект, используя действие построения
AndroidNativeLibrary
.Перестройте и повторно установите приложение.
Когда установка приложения завершится, запустите целевое устройство _Gdb
выполните созданную им команду 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
Построения выпуска
Для поддержки gdb
нужно выполнить три условия.
- Предоставить разрешение
INTERNET
. - Включить отладку приложения.
- Предоставить доступный
gdbserver
.
Разрешение INTERNET
по умолчанию включается в приложениях для отладки. Если в вашем приложении оно отсутствует, добавьте его, отредактировав файл Properties/AndroidManifest.xml или изменив свойства проекта.
Чтобы включить отладку приложений, установите свойство настраиваемого атрибута ApplicationAttribute.Debugging в значение true
или отредактируйте файл Properties/AndroidManifest.xml, присвоив атрибуту //application/@android:debuggable
значениеtrue
:
<application android:label="Example.Name.Here" android:debuggable="true">
Чтобы предоставить доступный gdbserver
, выполните инструкции из раздела Отладочная сборка без быстрого развертывания.
Одна досадная мелочь: целевое устройство MSBuild _Gdb
принудительно завершит все ранее запущенные экземпляры этого приложения. Это не выполняется на целевых устройствах с версией Android ниже 4.0.
Устранение неполадок
mono_pmip
не работает.
Функция mono_pmip
(она полезна для получения кадров управляемого стека), экспортируется из libmonosgen-2.0.so
, который в настоящее время не запрашивается целевым устройством _Gdb
. (Эта ошибка будет исправлена в будущих выпусках.)
Чтобы включить вызов функций, расположенных в файле libmonosgen-2.0.so
, скопируйте его с целевого устройства в каталог gdb-symbols
:
$ adb pull /data/data/Mono.Android.DebugRuntime/lib/libmonosgen-2.0.so Project/gdb-symbols
После копирования перезапустите сеанс отладки.
При выполнении команды gdb
возникает "Ошибка шины: 10"
Когда команда gdb
завершается ошибкой "Bus error: 10"
, перезапустите устройство 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.
Обычно это связано с тем, что содержимое каталога gdb-symbols
не синхронизируются с целевым устройством Android. (Может быть, вы изменили целевое устройство Android?)
Удалите каталог gdb-symbols
и повторите попытку.