无法调试嵌入在 Objective-C 应用中的 Swift module/framework
Cannot debug Swift module/framework embedded in Objective-C app
Alternative titles (to aid searching)
- Cannot debug Swift 2.3 framework linked to an Objective-C app in Xcode 8
error in auto-import: failed to get module 'XYZ' from AST context
Xcode 8
- Xcode 8 cannot debug Swift framework
warning: Swift error in module <XYZ>
- Workaround for; Xcode Debugger cannot debug apps written in Objective-C only but that link against frameworks written in Swift only. (28312362)
我有一个用 Objective-C 编写的应用程序,它 link 针对一些用 Swift 2.x.
编写的模块(框架)
问题
一切(调试等)在 xcode7, however when moving to xcode8 and updating the modules to use 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
如果我 link 在 Swift 2.3.
中内置应用程序的模块,则不会发生这种情况
tl:dr
在“构建设置”下为您的应用目标添加用户定义的设置。
SWIFT_VERSION = 2.3
更多信息
我不确定这是 Xcode 8 错误还是 Apple 政策(尝试强制开发人员使用 Swift 3.0?)。但是...默认情况下 Xcode 8 安装标准 Swift 运行时库的 Swift 3.0 版本。
当使用 LLDM 进行调试时,Swift 2.3 模块无法加载(进入 Swift 3.0 运行时)。
强制应用程序使用 Swift 2.3(或 Apple 称之为遗留 Swift)解决了这个问题。
Swift 应用程序已通过 Xcode 公开此设置,但您必须为 Objective-C 应用程序手动添加它。
进一步的建议
尽快将您的 Swift 2.3 代码移植到 Swift 3.0,Apple 不会长期支持 2.x。
在我的例子中,我不得不从构建设置文件中删除 Objective-C Bridging header
。我的 Bridging 头文件没有做任何事情..所以没关系。
对我来说,这既简单又痛苦且耗时:
import SDWebImage
是问题,
因为其中一个框架已经将 SDWebImage 打包在其中(我看不到它),而该框架恰好是 Objective-C,而应用程序是 Swift。
我还将 SDWebImage 添加到项目中,因为我在我编写的 类 中使用了它,这造成了 Xcode 调试器无法处理的混乱。
所以基本上,确保你没有以任何方式复制任何东西,我会检查常见的东西,例如 SDWebImage。
我在 9.3 模拟器中尝试调试时 运行 进入 error in auto-import: failed to get module 'XYZ' from AST context
消息。切换到 10.2 模拟器解决了这个问题。
我在 WWDC 2017 上与一位名叫 Sean 的 Apple 工程师讨论了这个问题。
我的团队花了数周的时间试图解决这个问题,最终它成为了 Apple 编译器上的一个错误,我们自己永远无法解决这个问题。此外,它有一个非常简单的解决方法。
从框架和项目以及 "pure Objective-C" 项目 "activates" 聚合编译标志的方式恰好存在一个错误。
解决方案:在您的 Objective-C 项目中添加一个空 Swift 文件("Whatever.swift" 或其他),使其不再是纯 objective-c ( new->file->Swift 文件,不要创建桥接头文件。该文件将只包含 Foundation 的导入)。
就是这样。问题已解决。
使用 fr v 代替 po 进行调试
更多调试
https://www.codeproject.com/Articles/1181358/Debugging-with-Xcode
尝试重新启动 Xcode。就我而言,它解决了一个问题。
在我的例子中,LLDB 中报告的 "C" 代码中存在编译器错误,修复错误后 LLDB 再次开始工作。
正如 Tim 所建议的,我们问题的根本原因是重复问题。
我们有一个用于 SDWebImage 的 obj-c 包装器类别,它被 obj-c 和 Swift 使用。
当从 Swift 导入类别时,由于 SDWebImage pod 已经将其自身暴露为 Swift 模块,因此由于 redefinition/duplicate 导入,一切都爆炸了。
解决办法?我们将 obj-c 类别重新实现为 Swift 扩展 - 并在 Swift 和 obj-c 中继续使用它,方法是在扩展前面添加 @objc
并导入 #import "product-Swift.h"
来自 obj-c 的文件。
也许可以从检查开始:https://developer.apple.com/library/content/qa/qa1947/_index.html。
我在用 Carthage 构建框架时 运行 参与其中。尝试调试会打印错误,该错误引用了 Obj-C 框架依赖项。
我发现这个 blog post 建议在我的项目中添加以下 user-defined 构建设置:
对于调试:REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = NO
待发布:REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = YES
这解决了我的问题。
我只用了2天的时间就一直通过打印命令解决和调试。现在我遇到了问题:
我的项目在 Swift 中,我使用的 objective-C 库与在 pods 中导入的库相同,用于 swift(旧的 Objective-C 项目合并到此一个)并且正在使用 import IQKeyboardManager 以及 import "IQKeyboardManager.h" header 。冲突和删除 header 最终解决了我的问题。
您可以在图书馆检查这种类型的口是心非。
Alternative titles (to aid searching)
- Cannot debug Swift 2.3 framework linked to an Objective-C app in Xcode 8
error in auto-import: failed to get module 'XYZ' from AST context
Xcode 8- Xcode 8 cannot debug Swift framework
warning: Swift error in module <XYZ>
- Workaround for; Xcode Debugger cannot debug apps written in Objective-C only but that link against frameworks written in Swift only. (28312362)
我有一个用 Objective-C 编写的应用程序,它 link 针对一些用 Swift 2.x.
编写的模块(框架)问题
一切(调试等)在 xcode7, however when moving to xcode8 and updating the modules to use 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
如果我 link 在 Swift 2.3.
中内置应用程序的模块,则不会发生这种情况tl:dr
在“构建设置”下为您的应用目标添加用户定义的设置。
SWIFT_VERSION = 2.3
更多信息
我不确定这是 Xcode 8 错误还是 Apple 政策(尝试强制开发人员使用 Swift 3.0?)。但是...默认情况下 Xcode 8 安装标准 Swift 运行时库的 Swift 3.0 版本。
当使用 LLDM 进行调试时,Swift 2.3 模块无法加载(进入 Swift 3.0 运行时)。
强制应用程序使用 Swift 2.3(或 Apple 称之为遗留 Swift)解决了这个问题。
Swift 应用程序已通过 Xcode 公开此设置,但您必须为 Objective-C 应用程序手动添加它。
进一步的建议
尽快将您的 Swift 2.3 代码移植到 Swift 3.0,Apple 不会长期支持 2.x。
在我的例子中,我不得不从构建设置文件中删除 Objective-C Bridging header
。我的 Bridging 头文件没有做任何事情..所以没关系。
对我来说,这既简单又痛苦且耗时:
import SDWebImage
是问题,
因为其中一个框架已经将 SDWebImage 打包在其中(我看不到它),而该框架恰好是 Objective-C,而应用程序是 Swift。
我还将 SDWebImage 添加到项目中,因为我在我编写的 类 中使用了它,这造成了 Xcode 调试器无法处理的混乱。
所以基本上,确保你没有以任何方式复制任何东西,我会检查常见的东西,例如 SDWebImage。
我在 9.3 模拟器中尝试调试时 运行 进入 error in auto-import: failed to get module 'XYZ' from AST context
消息。切换到 10.2 模拟器解决了这个问题。
我在 WWDC 2017 上与一位名叫 Sean 的 Apple 工程师讨论了这个问题。
我的团队花了数周的时间试图解决这个问题,最终它成为了 Apple 编译器上的一个错误,我们自己永远无法解决这个问题。此外,它有一个非常简单的解决方法。
从框架和项目以及 "pure Objective-C" 项目 "activates" 聚合编译标志的方式恰好存在一个错误。
解决方案:在您的 Objective-C 项目中添加一个空 Swift 文件("Whatever.swift" 或其他),使其不再是纯 objective-c ( new->file->Swift 文件,不要创建桥接头文件。该文件将只包含 Foundation 的导入)。
就是这样。问题已解决。
使用 fr v 代替 po 进行调试
更多调试 https://www.codeproject.com/Articles/1181358/Debugging-with-Xcode
尝试重新启动 Xcode。就我而言,它解决了一个问题。
在我的例子中,LLDB 中报告的 "C" 代码中存在编译器错误,修复错误后 LLDB 再次开始工作。
正如 Tim
我们有一个用于 SDWebImage 的 obj-c 包装器类别,它被 obj-c 和 Swift 使用。 当从 Swift 导入类别时,由于 SDWebImage pod 已经将其自身暴露为 Swift 模块,因此由于 redefinition/duplicate 导入,一切都爆炸了。
解决办法?我们将 obj-c 类别重新实现为 Swift 扩展 - 并在 Swift 和 obj-c 中继续使用它,方法是在扩展前面添加 @objc
并导入 #import "product-Swift.h"
来自 obj-c 的文件。
也许可以从检查开始:https://developer.apple.com/library/content/qa/qa1947/_index.html。
我在用 Carthage 构建框架时 运行 参与其中。尝试调试会打印错误,该错误引用了 Obj-C 框架依赖项。
我发现这个 blog post 建议在我的项目中添加以下 user-defined 构建设置:
对于调试:REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = NO
待发布:REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = YES
这解决了我的问题。
我只用了2天的时间就一直通过打印命令解决和调试。现在我遇到了问题:
我的项目在 Swift 中,我使用的 objective-C 库与在 pods 中导入的库相同,用于 swift(旧的 Objective-C 项目合并到此一个)并且正在使用 import IQKeyboardManager 以及 import "IQKeyboardManager.h" header 。冲突和删除 header 最终解决了我的问题。 您可以在图书馆检查这种类型的口是心非。