В этой статье мы коснемся отладки приложений в Xcode при помощи LLDB. Также мы рассмотрим, почему этот отладчик лучше подходит для аудита, и, конечно же, научимся самому процессу отладки.
Автор: Prateek Gianchandani
В этой статье мы коснемся отладки приложений в Xcode при помощи LLDB. Также мы рассмотрим, почему этот отладчик лучше подходит для аудита, и, конечно же, научимся самому процессу отладки.
Следующая выдержка взята из официальной документации от компании Apple:
Отладчик LLDB является альтернативой GDB. LLDB разрабатывался совместно с LLVM-компиляторами (Low Level Virtual Machine) и обладает широкими возможностями управления потоком выполнения приложения и анализа данных. Начиная с Xcode 5, все новые и уже существующие проекты автоматически настраиваются на использование LLDB. В стандартной конфигурации LLDB уже есть расширенный набор команд, совместимый с аналогичными командами в GDB. Помимо использования стандартной конфигурации вы всегда можете настроить LLDB под свои нужды.
Начать изучение LLDB уместно с просмотра видео с конференции WWDC 2014.
Остается лишь вопрос, почему LLDB лучше, чем GDB?
Вот несколько причин:
Для отладки приложений на iOS-устройстве мы будем использовать утилиту debugserver, входящую в состав Xcode. Обычно debugserver устанавливается на устройстве автоматически, когда устройству назначается статус «development». Отлаживаться будут только приложения, подписанные специальным профилем (provisioning profile) из-за ограничения прав на функцию task_for_pid(). Таким образом, чтобы отлаживать любое приложение, мы должны создать новый файл с правами доступа (entitlement file), где разрешена функция task_for_pid(), подписать debugserver и установить сервер отладки на устройстве. Обратите внимание, что debugserver в Mac OS находится внутри ram-диска с атрибутом «только чтение». То есть debugserver должен быть скопирован куда-то в другое место перед подписью новым файлом.
Итак, для начала монтируем образ диска на Мак и копируем debugserver в другое место. Используем следующую команду:
hdiutil attach /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/[ios version]\ \(12B411\)/DeveloperDiskImage.dmg
Рисунок 1: Подключаем образ диска
Рисунок 2: Содержимое диска
Затем создаем новый файл entitlements.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/ PropertyList-1.0.dtd">
<key>com.apple.springboard.debugapplications
<true/>
<key>run-unsigned-code
<true/>
<key>get-task-allow
<true/>
<key>task_for_pid-allow
<true/>
Далее подписываем debugserver при помощи ранее созданного файла.
codesign -s – –entitlements entitlements.plist -f debugserver
Рисунок 3: Подписывание debugserver
Затем устанавливаем заново подписанный файл на устройстве. Чтобы запустить debugserver, используйте команду ниже. Кроме того, не забудьте указать приложение, к которому вы хотите подцепить отладчик.
Рисунок 4: Подключение отладчика к приложению Twitter
Теперь на компьютере запускаем LLDB и заходим в интерпретатор. Для подключения к устройству используйте команды ниже. Не забудьте поменять IP-адрес на IP-адрес вашего устройства.
Рисунок 5: Подключение к устройству
Теперь вы можете отлаживать приложение.
Рисунок 6: Попытка подключения к процессу
Затем вы можете использовать команду po для вывода экземпляров объектов.
Рисунок 7: Экземпляры некоторых объектов
Синтаксис LLDB немного отличается от GDB. Например, чтобы вывести содержимое всех регистров, используйте следующую команду:
Рисунок 8: Команда для вывода содержимого всех регистров
На сегодня все. В следующей статье мы рассмотрим более продвинутые техники для работы с LLDB (в частности, научимся находить конфиденциальную информацию в памяти).