Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Обзор
В 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 и повторите попытку.