Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Начиная с исходного монолитного исполняемого файла 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 для получения/установки значений регистра.

Ответ 2

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

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

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

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

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

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

Сложение:

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

Ответ 3

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

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

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