Отладочная документация Xamarin указывает:
Используйте встроенную поддержку отладки Xamarin Studio для отладки С# и другой код управляемых языков и использовать LLDB, когда вам нужно отлаживать C, С++ или Objective C, которые вы могли бы связать с вашим Xamarin.iOS проект.
Однако я не могу найти документацию о том, как использовать LLDB для отладки приложения Xamarin. Если я запустил приложение в iPhone Simulator и попытаюсь подключиться к нему с помощью LLDB, я получаю следующую ошибку:
(lldb) attach --pid 37993
Process 37993 exited with status = -1 (0xffffffff) lost connection
error: attach failed: lost connection
Прикрепление с помощью Xcode также не работает. Я пробовал разные варианты attach
, но никто из них не работал.
Может ли кто-нибудь указать мне в правильном направлении, как отлаживать приложения Xamarin с LLDB? Более того, это то, что я могу сделать на устройстве, а не только в симуляторе? Я не нашел никакой информации о том, как использовать LLDB для присоединения к процессу на устройстве.
Обновление
Похоже, процесс debugserver
сбой, когда я использую lldb
для подключения к моему двоичному файлу. Вот ссылка на отчет о сбое для debugserver
:
https://www.dropbox.com/s/9lizhl2quj9n0cc/debugserver_2015-07-07-131423_gauss.crash?dl=0
Обновление 2
Когда я запускаю dtruss
в приложении, он печатает системные вызовы, пока не встретит
dtrace: error on enabled probe ID 2475 (ID 194: syscall::ptrace:return): invalid user access in action #5 at DIF offset 0
которое происходит, когда что-то вызывает ptrace(PT_DENY_ATTACH, 0, 0, 0);
Почему PT_DENY_ATTACH
вызывается?
Обновление 3
Я проследил системный вызов ptrace
к этой функции: mono_assembly_init_with_opt
, который происходит очень рано в жизни программы. Вся эта функция выполняет вызов ptrace, поэтому, если я только вернусь раньше от этой функции, я могу выполнить отладку с lldb.
В принципе, я могу сделать:
(lldb) process attach --name AppName --waitfor
# when the process starts
(lldb) b mono_assembly_init_with_opt
(lldb) c
# when the thread breaks
(lldb) thread return 0
(lldb) c
и теперь я могу с радостью отладить с lldb.
Но я не должен был этого делать. Что-то не так с моей конфигурацией проекта (я могу отлаживать более простые приложения с lldb), или Xamarin является злым?