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

问题描述 投票:27回答:11

Alternative titles (to aid searching)

  • 无法调试链接到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 Debugger不能只调试用Objective-C编写的应用程序,而只能用针对用Swift编写的框架进行链接。 (28312362)

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

Question

一切(调试等)在中工作正常,但是当移动到并更新模块以使用时,我无法调试模块。

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

xcode lldb swift3 xcode8 swift2.3
11个回答
18
投票

对我来说,它既简单又痛苦又耗时:

import SDWebImage是问题,因为其中一个框架已经包含了SDWebImage(我无法看到它),而且该框架碰巧是Objective-C,而应用程序是Swift。我还将SDWebImage添加到项目中,因为我在我编写的类中使用它,并且创建了Xcode调试器无法处理的混乱。所以基本上,确保你没有以任何方式复制任何东西,我会检查像SDWebImage这样的常见内容。


0
投票

根据Tim https://stackoverflow.com/a/41876400/1840269的建议,我们问题的根本原因是重复的问题。

我们有一个用于SDWebImage的obj-c包装器类别,它从obj-c和Swift中使用。当从Swift导入类别时,由于重新定义/重复导入,因为SDWebImage pod已将其自身暴露为Swift模块,所以一切都爆炸了。

解决方案?我们将obj-c类重新实现为Swift扩展 - 并通过在扩展前添加@objc并从obj-c导入#import "product-Swift.h"文件,继续在Swift和obj-c中使用它。

也许可以从检查开始:https://developer.apple.com/library/content/qa/qa1947/_index.html


0
投票

我花了两天时间让我一直通过print命令解决和调试。现在我遇到了这个问题:

我的项目是在Swift中,我使用的Objective-C库与在pods中为swift导入的相同(旧的Objective-C项目在此合并),并且使用了导入IQKeyboardManager以及导入“IQKeyboardManager.h”标题。冲突和删除标题最终解决了我的问题。您可以在库中检查这种类型的重复性。


11
投票

使用fr v代替po进行调试

有关更多调试https://www.codeproject.com/Articles/1181358/Debugging-with-Xcode


9
投票

我在2017年WWDC上与一位名叫Sean的Apple工程师讨论了这个问题。

我的团队花了几周的时间试图解决这个问题,结果却成了Apple编译器的一个错误,我们自己也想不到这个错误。此外,它有一个非常简单的解决方法。

编译标志从框架和项目聚合的方式恰好存在错误,“纯Objective-C”项目“激活”它。

解决方案:在Objective-C项目中添加一个单独的空Swift文件(“Whatever.swift”或其他),使其不再是纯粹的Objective-c(new-> file-> Swift文件,不要创建桥接头。该文件只包含Foundation的导入。

就是这样。问题解决了。


6
投票

tl:dr

在“构建设置”下为您的应用目标添加用户定义的设置。

SWIFT_VERSION = 2.3

SWIFT_VERSION = 2.3 — Build Settings

More Info

我不确定这是一个Xcode 8错误还是它的Apple策略(尝试强制开发人员使用Swift 3.0?)。但是......默认情况下,Xcode 8安装Swift 3.0版本的标准Swift运行时库。

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

强制应用程序使用Swift 2.3(或Apple称之为传统的Swift),解决了这个问题。

Swift应用程序已将此设置暴露给Xcode,但您必须手动将其添加到Objective-C应用程序中。

Further Advice

尽快将Swift 2.3代码移植到Swift 3.0,Apple将不会长时间支持2.x.


2
投票

在我的情况下,我不得不从构建设置文件中删除Objective-C Bridging header。我的Bridging头文件没有做任何事情..所以没关系。


2
投票

尝试在9.3模拟器中调试时,我遇到了error in auto-import: failed to get module 'XYZ' from AST context消息。切换到10.2模拟器解决了这个问题。


2
投票

在与Carthage构建框架时遇到了这个问题。尝试调试会打印错误,该错误引用了Obj-C框架依赖项。

我发现这个blog post建议在我的项目中添加以下用户定义的构建设置:

对于调试:REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = NO

发布:REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES = YES

这为我解决了这个问题。


1
投票

尝试重新启动Xcode。就我而言,它解决了一个问题。


0
投票

在我的情况下,LLDB中报告的“C”代码中存在编译器错误,在修复错误LLDB再次开始工作之后。

© www.soinside.com 2019 - 2024. All rights reserved.