Xcode 9 - Framework точки останова

В Xcode 7 и 8 я смог отладить разрабатываемую фреймворк, запустив содержащее приложение в xcworkspace, которое также содержит проект фреймворка. Если бы я установил точки останова в структуре, они бы сработали во время выполнения.

В Xcode 9 beta 6 это больше не так. До сих пор выполнение останавливается только в точках останова фреймворка при отладке на симуляторе. Когда я отлаживаю на физическом устройстве, точки останова платформы не останавливают выполнение, и кажется, что они полностью игнорируются.

Как я могу заставить точки останова платформы работать должным образом, чтобы отладить мою структуру на iOS 11 в Xcode 9?

FWIW: xcworkspace был создан с помощью pod install внутри корневого каталога фреймворка. Затем я добавил xcodeproj примера приложения в xcworkspace. Это было функционально вплоть до тестирования на Xcode 9 beta 6.

Редактировать: подтвердил, что это поведение все еще имеет место на начальном этапе GM Xcode 9.0.

3 ответа

Решение

TL; DR - мне нужно было изменить каталог, из которого читает мой архивный скрипт при отладке или при подготовке релиза. Теперь при отладке я должен быть уверен, что для конфигурации конфигурации моей схемы фреймворка установлено значение "Отладка", если я хочу, чтобы точки останова работали правильно во время выполнения. Я использую "Release" только при подготовке готовой рамы.

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

Xcode должен сопоставить исполняемый двоичный файл с символами отладки, которые все еще находятся на вашем компьютере. XCode должен делать это автоматически, но похоже, что некоторые вещи перемещаются за спиной XCode. Чтобы узнать, соответствует ли отладочная информация, вы можете посмотреть на вывод списка изображений (lldb) и /Mac/path/to/Build/Products/Debug-iphoneos% dwarfdump --uuid iOS-App.app/iOS-App, который будет работать на дилибах тоже.

Есть ли в вашей структуре круглые скобки вокруг адреса? Это верный признак того, что lldb не может найти ваши символы.

если UUID в списке изображений не соответствует dwarfdump, то что-то изменило исполняемый файл до его запуска и не соответствует вашим встроенным продуктам. Мы не уверены, может ли липо сделать это, что я вижу в вашем сценарии, но обязательно проверю. Ничего не поделаешь, если отладочной информации больше не существует.

Если вы можете найти подходящий исполняемый файл с соответствующим UUID на вашем диске, вы можете просто (lldb) добавить изображение /Mac/path/to/DerivedData-asdfasdfadf/Products/Debug-iphoneos/iOS-App.app/Frameworks/Framework

Кроме того, Xcode использует Spotlight для поиска символов на вашем компьютере. Чтобы избежать постоянной повторной индексации при сборке, каталог Intermediates/, содержащий файлы.o и другое место, где хранится отладочная информация, был помещен в черный список. Это произошло довольно поздно в Xcode 9.0, поэтому может быть причиной того, что ваши вещи работали раньше.

Когда я побежал (lldb) image list во время выполнения я увидел, что UUID моего фреймворка не соответствует тому, о котором сообщил dwarfdump в /Mac/path/to/Build/Products/Debug-iphoneos,

В итоге я изменил свой постархивный скрипт, чтобы изменить каталог сборки, из которого он читает при создании фреймворка. Когда я установлю свою конфигурацию архива на "Debug", она теперь будет читать из Debug-iphoneos. Когда я установил его на "Release", он читает из ${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}

# NOTE: This script creates a universal framework (device and simulator). However, *** for this to work: a Simulator target must be built first, and then Archive on the Device ***

BUILD_PRODUCTS="${SYMROOT}/../../../../Products"
SIM_PATH="${BUILD_PRODUCTS}/Debug-iphonesimulator/${TARGET_NAME}.framework"
if [ "${CONFIGURATION}" = "Debug" ]; then
 DEV_PATH="${BUILD_PRODUCTS}/Debug-iphoneos/${TARGET_NAME}.framework"
elif [ "${CONFIGURATION}" = "Release" ]; then
 DEV_PATH="${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/${TARGET_NAME}.framework"
fi
DEST_PATH="${PROJECT_DIR}/../Frameworks/${TARGET_NAME}.framework"

rm -rf "${DEST_PATH}"
mkdir "${DEST_PATH}"
cp -r "${DEV_PATH}/" "${DEST_PATH}/"
rm -f "${DEST_PATH}/${TARGET_NAME}"
cp -Rn "${SIM_PATH}/Modules/" "${DEST_PATH}/Modules/"

lipo -create "${SIM_PATH}/${TARGET_NAME}" "${DEV_PATH}/${TARGET_NAME}" -output "${DEST_PATH}/${TARGET_NAME}"

Если пути сбивают с толку, я не виню вас. По сути, рабочее пространство выглядит так:

RootDirectory
|__SampleApp
   |__SampleApp.xcodeproj
|__Frameworks
   |__MyFramework.framework
   |__AnotherFramework.framework
|__MyFramework
   |__MyFramework.xcworkspace
   |__MyFramework.xcodeproj
   |__Podfile (etc..)

Мой сценарий:

У меня есть мои рамки в другом пути. Обычно я получаю .framework, когда строю его. И затем я добавляю этот каркас (MyFramework.framework) в мой проект.

Мое предложение:

  1. Добавьте новую точку останова перед вызовом фреймворка. как это

  1. Нажмите эту кнопку Step Into, когда выполнение программы достигнет точки останова.

Теперь выполнение перейдет в исходную область вашего фреймворка. В этот момент вы должны добавить новые точки останова в любом месте вашей фреймворк.

Это рабочее решение в Xcode 9 и iOS 11. Надеюсь, это поможет вам. Удачи.

Следующие шаги будут работать, если вы интегрировали xyz.framework в проект abc.

      1)For project abc, add a breakpoints at the places you want.
2)Go to breakpoint list, select all breakpoints, right click and click move breakpoint to user.

Выполните вышеуказанные 2 шага для xyz.framework

Теперь запустите проект abc, и точки останова фреймворка также будут работать.

Другие вопросы по тегам