无法调试嵌入在Objective-C应用中的Swift模块/框架

32

备选标题(以便搜索)

  • 无法在 Xcode 8 中调试链接到 Objective-C 应用的 Swift 2.3 框架
  • error in auto-import: failed to get module 'XYZ' from AST context Xcode 8
  • Xcode 8 无法调试 Swift 框架
  • warning: Swift error in module <XYZ>
  • 解决方案:Xcode 调试器无法调试只使用 Objective-C 编写但链接到仅使用 Swift 编写的框架的应用程序。 (28312362)

我有一个使用 Objective-C 编写并链接到一些使用 Swift 2.x 编写的模块(框架)的应用程序。

问题

中,所有功能(包括调试等)都正常工作,但是当升级模块以使用 并切换到 后,我无法调试这些模块。

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构建的应用程序中,则不会发生这种情况。

11个回答

19

对我来说,这件事情既痛苦又耗时,但其实很简单:

import SDWebImage问题所在,因为其中一个框架已经预装了SDWebImage(而我无法看到它),同时该框架是Objective-C编写的,而应用则是Swift编写的。 我还将SDWebImage添加到了项目中,因为我在编写的类中使用它,这就导致了Xcode调试器无法处理的混乱。 因此,基本上请确保您没有以任何方式重复了任何东西,例如SDWebImage等常见项目。


1
我曾经遇到完全相同的问题,感谢你指出来。 - userx
1
@Tim Friedland,JSON模型框架也遇到了同样的问题,感谢您的答案。 - SARATH SASI
1
是的,完美的答案。节省了我很多时间。谢谢@Tim Friedland。 - PALAK Mobile Team Leader
1
在我的情况下,我同时使用了SDWebImage和FirebaseUI(它依赖于SDWebImage),并在Swift中导入了这两个库。将这些导入语句移到我的桥接头文件中解决了我的问题。 - Mick MacCallum

11

1
fr v 代表 "frame variable"。更多信息可在LLDB调试指南中找到。 - leanne
3
似乎不是一个解决方案,因为帧变量无论如何都可以在控制台的左面板看到,但并没有所有必要的输出。 - Injectios

9
我在WWDC 2017上与名为Sean的苹果工程师讨论了这个问题。我的团队花了几周时间试图找出问题所在,最后发现这是苹果编译器上的一个bug,我们自己永远无法找到。此外,这个问题有一个非常简单的解决方法。由于框架和项目中的编译标志聚合存在错误, "纯Objective-C"项目会“激活”它。
解决方案:在您的Objective-C项目中添加一个单独的、空的Swift文件("Whatever.swift"或其他名称),使其不再是纯Objective-C(新建->文件->Swift文件,不创建桥接头文件。该文件将只包含Foundation的导入)。
这就是解决问题的全部内容。

你是否有与此相关的rdar或Swift错误编号? - Dmitry Shevchenko
为了修复仅包含Swift测试的项目的调试问题,您仍需要添加一个针对该项目的空Swift文件。仅添加Swift测试文件是不够的。如果其他人遇到此解决方案并且只想使用Swift编写测试,则可以参考此方法。 - Psiticosis

6

简述

在“Build Settings”下为您的应用程序目标添加用户定义的设置。

SWIFT_VERSION = 2.3

SWIFT_VERSION = 2.3 — Build Settings

更多信息

我不确定这是Xcode 8的一个bug还是苹果政策(试图强制开发人员使用Swift 3.0?)。但是……默认情况下,Xcode 8会安装标准Swift运行时库的Swift 3.0版本。

当使用LLDM进行调试时,Swift 2.3模块无法加载(到Swift 3.0运行时中)。

强制应用程序使用Swift 2.3(或者像苹果所说的旧版Swift),可以解决此问题。

Swift应用程序通过Xcode公开此设置,但您必须手动将其添加到Objective-C应用程序中。

进一步建议

尽快将您的Swift 2.3代码移植到Swift 3.0,因为苹果不会长时间支持2.x。


Xcode 8.0将尝试确定您正在使用哪个版本的Swift并选择适当的工具链。 您项目设置中的某些内容正在破坏该检测。例如,对于纯ObjC项目,Xcode将选择最新可用的工具链,这也恰好是Swift 3.0。 也许,例如,Xcode没有查看纯ObjC目标的依赖子项目或目标,以查看其中是否有任何Swift?这似乎值得报告一个错误。 - Jim Ingham
由于某些原因,这对我们不起作用。明确设置swift_version(在8A218a中标记为“使用旧版Swift语言版本”)不会影响结果。 - David Lord
@DavidLord "Use Legacy Swift Language Version"是不同的,这个用于告诉Xcode你想要使用Swift 2.x而不是3.x,在上述情况下,它应该设置在Framework目标上。SWIFT_VERSION应该设置在(Objective-C)应用程序目标上。希望这对你有所帮助! - Richard Stelling
啊,确实!你所描述的问题在我们的纯Swift项目中也存在,但我们的Swift模块中没有Obj-C链接。感谢你的问答,我们会继续尝试(或者在转移到Swift 3之前不使用LLDB)。 - David Lord
"错误的自动导入" 这个问题可能是一个一般性的诊断,可能代表了许多不同的错误。我也遇到了相同的错误,但没有告诉我 哪个 模块引起的这个错误的消息,这让我怀疑这是一个完全不同的问题。而且我已经重复检查了 swift_version 的设置是正确的。 - David Goodine
There already is another setting named "SWIFT_VERSION". Please enter a different name. - Vyachaslav Gerchicov

2

在尝试在9.3模拟器中调试时,我遇到了自动导入错误:无法从AST上下文获取模块“XYZ”的消息。切换到10.2模拟器解决了这个问题。


2
在我的情况下,我需要从构建设置文件中删除 Objective-C Bridging header。我的 Bridging header 文件没有起到任何作用,所以这样做是可以的。

2
我在使用Carthage构建框架时遇到了这个问题。尝试调试会打印错误,该错误引用了一个Obj-C框架依赖项。
我发现这篇博客文章建议将以下用户定义的构建设置添加到我的项目中:
对于Debug:REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = NO 对于Release:REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = YES 这为我解决了问题。

0

我花了两天时间通过打印命令进行调试和解决问题。现在我找到了问题所在:

我的项目是用Swift编写的,我使用了与导入的Pods中的Objective-C库相同的库(旧的Objective-C项目合并到这个项目中),同时也使用了import IQKeyboardManager以及import "IQKeyboardManager.h"头文件。这会产生冲突,删除头文件后终于解决了我的问题。 您可以检查库中是否存在这种重复。


0

尝试重新启动Xcode。在我的情况下,这解决了一个问题。


0
在我的情况下,“C”代码中有一个编译器错误,在LLDB中报告了这个错误,修复后LLDB又开始正常工作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接