无法调试嵌入在 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.

编写的模块(框架)

问题

一切(调试等)在 , however when moving to and updating the modules to use 中工作正常我无法调试模块。

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 最终解决了我的问题。 您可以在图书馆检查这种类型的口是心非。