Отладка iOS-приложения на устройстве без символов

31

Мне нужно отлаживать запуск для приложения iOS на самом устройстве... и при запуске я подразумеваю, что самая первая инструкция, которая выполняется, когда ОС управляет этим приложением. Не "главное". Кроме того, это приложение не имеет никаких символов (т.е. Отладочная информация пока недоступна). Мне все равно, нужно ли мне отлаживать уровень инструкций процессора. Я знаю, как это сделать (сделано это более 30 лет). Я хочу, чтобы отладчик остановился, когда элемент управления перейдет в приложение. Когда я использую команду "Прикрепить по имени" и запускаю ее, она просто говорит "Готово".

О, и это приложение не было создано в XCode. Это, однако, приложение, которое я построил, подписал и подготовил и перешел на устройство. Приложение работает, так как я могу видеть вывод консоли. На всякий случай вы думаете, что я хакер пытается отладить какое-то приложение.

Как это для высокого порядка? Я готов поспорить, никто не может ответить на этот вопрос... Я не смог найти какую-либо информацию о том, как я могу это сделать с помощью проекта, построенного на XCode. Интересно, возможно ли это просто невозможно или "разрешено" владельцами Apple?

Что вы скажете, боги?

ОБНОВЛЕНИЕ: Я должен кое-что уточнить. Это приложение не создано с помощью любого коммерчески доступного или открытого инструмента. Я работаю с поставщиком инструментов, создающим компиляторы, фреймворки и IDE. IOW, вы не можете получить этот инструмент... пока. В процессе начальной загрузки новой цепочки инструментов, каждый из них должен прибегать к очень низкоуровневой отладке исходного кода. Особенно, если есть ошибки в коде, сгенерированном инструментами.

  • 0
    Я сомневаюсь, что вы сможете сделать это, не будучи сотрудником Apple.
  • 10
    Если это так, то это просто еще один случай, когда Apple является настолько же враждебным инструментом для разработчиков, насколько это возможно. Даже РС в самые антиконкурентные годы никогда не был таким враждебным.
Показать ещё 6 комментариев
Теги:
xcode
lldb

3 ответа

23

Я собираюсь ответить на собственный вопрос, потому что думаю, что наткнулся на решение. Если у кого-то есть что-то более элегантное и простое, ответьте также. На шагах:

Начиная с исходного монолитного исполняемого файла iOS (не связанного .app, а с фактическим двоичным файлом mach-o, который является машинным кодом).

  • Создайте новый проект Xcode с похожим именем. Создайте и запустите его на устройстве.
  • Найдите папку выходного пакета .app.
  • Скопируйте вышеуказанный исходный исполняемый файл iOS поверх существующего в папке пакета .app.
  • Теперь приложение будет иметь недопустимую подпись и не может быть развернуто и запущено.
  • Выполнить кодовое обозначение с помощью пакета приложений (вы можете найти командную строку, запустив xcodebuild в вышеупомянутом проекте Xcode).
  • В папке .app bundle запустите otool -h -l на двоичном изображении. Найдите команду загрузки LC_UNIXTHREAD и найдите значение, связанное с регистром "pc". Это адрес, где загрузчик os перейдет в ваше приложение. Если этот адрес нечетный, то это инструкции Thumb, иначе это будет ARM (я думаю, что он работает).
  • Добавить символическую точку останова (я использовал GDB вместо LLDB) и ввести в качестве символа адрес '* 0x00001234'.
  • Выбрать продукт | выполнить действие | выполнить без создания.

Предполагая, что GDB может оценить выражение точки останова и установить точку останова, и вы выбрали Product | Debug Workflow | Show Disassembly When Debugging, процесс должен разорваться при первой команде, которая будет выполнена в приложении.

Теперь вы можете сделать один шаг инструкциями и использовать консоль GDB для получения/установки значений регистра.

  • 1
    Рад видеть, что вы нашли способ заставить это работать!
  • 2
    Это слегка не по теме, но это связано с вашей точкой зрения об использовании GDB вместо LLDB. При использовании LLDB и отладке приложения на симуляторе «представление модулей» совершенно пустое. Если вы хотите выяснить, какие системные дилибы находятся в памяти вашего приложения, вы не можете !? Обходной путь должен настроить проект для использования вместо этого GDB, но внесение этого изменения конфигурации проекта заставляет XCode выдавать новое предупреждение.
Показать ещё 2 комментария
2

Ваш вопрос не имеет смысла - главная точка входа в приложение. Это первый код, который должен быть встречен, если, возможно, у вас нет инициализации(), переопределенной для некоторых классов (но даже тогда я думаю, что главная будет ударяться до выполнения).

Я думаю, что вы видите какую-то нечетную ошибку при запуске, и вы думаете, что хотите установить точку останова на запись, чтобы поймать ее, но гораздо более вероятно, что вам поможет описать проблему при запуске и позволить одному из 4000 человек, которые видели и исправили один и тот же крах, помогут вам...

Однако, если вы действительно хотите использовать GDB для разрыва приложения без каких-либо символов (но вы запускаете его из XCode), вы можете разбить GDB на адрес сборки в соответствии с:

Как разбить инструкцию по сборке по заданному адресу в gdb?

Чтобы найти адрес основного (или других методов), вы можете использовать инструмент или atos, некоторые примеры в этом вопросе:

Соответствие смещений в дампе сбоя iOS для дизассемблированного бинарного файла

Сложение:

Если по какой-то причине XCode не может запустить приложение для отладки, вы также можете сделать джейлбрейк и установить GDB на самом устройстве, что даст полный контроль над отладкой. Если XCode может запустить ваше приложение, я не вижу причин, по которым возможность разбить на произвольный адрес памяти не дает вам возможности, которые вы ищете...

  • 16
    Э-э ... "основной" не фактическая точка входа. Он вызывается из фактического кода запуска, который содержит точку входа.
  • 0
    Хорошо, технически верно ... но он сказал "передает управление приложению", а не какой-то код-обертка или системная библиотека ... какой в этом смысл?
Показать ещё 6 комментариев
1

Единственное решение, которое я нашел, - это приложения с webview, но в симуляторе через Safari Remote Debugger. Это не по теме, но, возможно, тот, кто может выиграть.

http://hiediutley.com/2011/11/22/debugging-ios-apps-using-safari-web-inspector/

Или используйте netcat для IOS... не самое совершенное решение, но по крайней мере вы видите, что происходит.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню