Не удается отладить модуль/фрейм Swift, встроенный в приложение Objective-C
Альтернативные заголовки (для поиска)
- Невозможно отладить структуру Swift 2.3, связанную с приложением Objective-C в Xcode 8
-
error in auto-import: failed to get module 'XYZ' from AST context
Xcode 8 - Xcode 8 не может отлаживать инфраструктуру Swift
-
warning: Swift error in module <XYZ>
- Временное решение; Xcode Debugger не может отлаживать приложения, написанные только в Objective-C, но эту ссылку против фреймворков, написанных только в Swift. (28312362)
У меня есть приложение, написанное в Objective-C, которое ссылается на некоторые модули (фреймворки), написанные в Swift 2.x.
Вопрос
Все (отладка и т.д.) отлично работает в xcode7, однако при переходе на xcode8 и обновление модулей для использования swift2.3 я не удалось отладить модули.
LLDB сообщил об этих ошибках:
warning: Swift error in module XYZ.
Debug info from this module will be unavailable in the debugger.
error: in auto-import:
failed to get module 'ABC' from AST context
Это не происходит, если я привяжу модули к приложению, созданному в Swift 2.3.
Ответы
Ответ 1
ТЛ: дг
Добавьте настройку, определенную пользователем, в разделе "Настройки сборки" для целевой цели вашего приложения.
SWIFT_VERSION = 2.3
![SWIFT_VERSION = 2.3 - Настройки сборки]()
Подробнее
Я не уверен, что это ошибка Xcode 8 или политика Apple (чтобы попытаться заставить разработчиков Swift 3.0?). Но... по умолчанию Xcode 8 устанавливает версии Swift 3.0 стандартных библиотек времени исполнения Swift.
Когда дело доходит до отладки с LLDM, модули Swift 2.3 не загружаются (в среду исполнения Swift 3.0).
Принудительное приложение для использования Swift 2.3 (или устаревшего Swift, как его называют Apple), устраняет проблему.
У приложений Swift этот параметр отображается в Xcode, но вы должны вручную добавить его для приложения Objective-C.
Дополнительные советы
Поместите свой Swift 2.3 код в Swift 3.0 как можно скорее, Apple не будет поддерживать 2.x очень долго.
Ответ 2
Для меня это было так же просто, как это было больно и отнимало много времени:
import SDWebImage
был ПРОБЛЕМОЙ, потому что в одной из платформ уже был упакован SDWebImage (и я его не видел), и этой платформой оказался Objective-C, а приложение - Swift. Я также добавил SDWebImage в проект, потому что я использую его в классах, которые я пишу, и то, что создало беспорядок, с которым не может справиться отладчик Xcode. В общем, убедитесь, что у вас НИЧЕГО не продублировано, я бы проверил, например, такие общие вещи, как SDWebImage.
Ответ 3
используйте fr v вместо po для отладки
Для большей отладки
https://www.codeproject.com/Articles/1181358/Debugging-with-Xcode
Ответ 4
Я обсуждал эту проблему с инженером Apple по имени Шон на WWDC 2017.
Моя команда провела недели, пытаясь понять это, и это оказалось ошибкой в Apple-компиляторе, который мы никогда бы не разобрали сами. Кроме того, он имеет ОЧЕНЬ легкое обходное решение.
Там случается ошибка с тем, как компиляционные флаги агрегируются из фреймворков и проекта, а проект "чистый Objective-C" активирует его.
Решение: добавьте один единственный пустой файл Swift ( "Whatever.swift" или что-то еще) в ваш проект Objective-C, сделав его not-pure- objective-c больше (new- > file- > Swift file, don 't создать заголовок моста. Файл будет содержать только импорт Foundation).
И что это. Проблема решена.
Ответ 5
В моем случае мне пришлось удалить Objective-C Bridging header
из файла настроек сборки. Мой заголовочный файл Bridging ничего не сделал.. так что все в порядке.
Ответ 6
Я столкнулся с сообщением error in auto-import: failed to get module 'XYZ' from AST context
при попытке отладки в симуляторе 9.3. Переключение на симулятор 10.2 разрешило проблему.
Ответ 7
Я столкнулся с этим при создании каркаса с Карфагеном. Попытка отладки выдаст ошибку, которая ссылается на зависимость от инфраструктуры Obj-C.
Я нашел эту запись в блоге, в которой предлагалось добавить в проект следующие пользовательские настройки сборки:
Для отладки: REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = NO
Для выпуска: REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = YES
Это исправило проблему для меня.
Ответ 8
Попробуйте перезапустить Xcode. В моем случае он разрешил проблему.
Ответ 9
В моем случае была ошибка компилятора в коде "C", о котором сообщалось в LLDB, после исправления ошибки LLDB снова начал работать.
Ответ 10
Как предположил Тим fooobar.com/questions/295940/... основной причиной нашей проблемы был вопрос дубликатов.
У нас была категория обертки obj-c для SDWebImage, которая использовалась как для obj-c, так и для Swift. При импорте категории из Swift все взорвалось из-за переопределения/дублирования импорта, так как модуль SDWebImage уже выставил себя как модуль Swift.
Решение? Мы повторно реализовали категорию obj-c как расширение Swift и продолжали использовать ее как из Swift, так и из obj-c, добавив @objc
перед расширением и импортировав файл #import "product-Swift.h"
из obj- с.
И, возможно, начать с проверки: https://developer.apple.com/library/content/qa/qa1947/_index.html.
Ответ 11
Мне просто потребовалось 2 дня, чтобы все время разрешать и отлаживать с помощью команды печати. Теперь я получил вопрос:
Мой проект находится в Swift, и я использовал библиотеку Objective-C, аналогичную импортированной в pods для swift (старый проект Objective-C, объединенный в этом), и использовал импорт IQKeyboardManager, а также заголовок import IQKeyboardManager.h. Это конфликты и удаление заголовка, наконец, решили мою проблему. Вы можете проверить с этим типом двуличия в библиотеках.