Swift编译器在handleDeferredImports中进行segfaulting

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift编译器在handleDeferredImports中进行segfaulting相关的知识,希望对你有一定的参考价值。

我们已经开始看到一个奇怪的问题,出现了一些无处不在,编译器在handleDeferredImports中的段错误。这并不总是发生,有时我需要清理和重建2-3次以再次触发它,因此很难确定它的根本原因。

我也无法在一个单独的示例项目中重现它,但在寻找解决方案两天后,我正在画一个空白。

这是段错误:error: Segmentation fault: 11有以下堆栈:

0  swift                    0x000000011307064a PrintStackTraceSignalHandler(void*) + 42
1  swift                    0x000000011306fdfe SignalHandler(int) + 302
2  libsystem_platform.dylib 0x00007fff76391b3d _sigtramp + 29
3  libsystem_platform.dylib 000000000000000000 _sigtramp + 2311513312
4  swift                    0x0000000110605df0 swift::ClangImporter::Implementation::handleDeferredImports() + 512
5  swift                    0x00000001106058dc swift::ClangImporter::Implementation::importHeader(swift::ModuleDecl*, llvm::StringRef, swift::SourceLoc, bool, std::__1::unique_ptr<llvm::MemoryBuffer, std::__1::default_delete<llvm::MemoryBuffer> >, bool) + 1804
6  swift                    0x0000000110606754 swift::ClangImporter::importBridgingHeader(llvm::StringRef, swift::ModuleDecl*, swift::SourceLoc, bool, bool) + 932
7  swift                    0x000000011010acfd swift::CompilerInstance::performSema() + 2029
8  swift                    0x000000010f2f859b performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*) + 731
9  swift                    0x000000010f2f4dc5 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 7717
10 swift                    0x000000010f29aa35 main + 1349
11 libdyld.dylib            0x00007fff761a808d start + 1
12 libdyld.dylib            0x0000000000000123 start + 2313519255

单个文件或标题没有任何指示。

我们使用Objective-C和Swift的混合,在很多文件中导入ProjectModuleName-Swift.h,类似的,有一个非常大的ProjectModuleName-Bridging-Header.h文件。除此之外,由于遗留原因,有一个ProjectModuleName-Prefix.pch默认Objective-C包括(是的,我知道这很糟糕)。

这里有什么奇怪的是handleDeferredImports中的段错误,它与Stack Overflow上发现的所有其他Swift编译器段错误问题不同。

Swift版本是4.2,我们正在使用Xcode 10中的“新构建系统”(它也是“Legacy Build System”的段错误)。

答案

Swift 4编译器的解决方法是为所有构建启用Whole Module优化。

问题本身似乎已在Swift 5.0中得到修复

如果有人在将来看到这个问题,请参阅https://bugs.swift.org/browse/SR-9528

以上是关于Swift编译器在handleDeferredImports中进行segfaulting的主要内容,如果未能解决你的问题,请参考以下文章

(Swift Playground 模板)使用 Swift 5.1 编译的模块不能被 Swift 5.1.3 编译器导入

使用 Swift 4.0.3 编译的模块不能被 Swift 4.2.1 编译器导入

swift 编译器总是 100% CPU

Swift安全在哪儿?末尾有彩蛋!

Xcode 9:使用 Swift 3.1 编译的模块无法在 Swift 4.0 中导入

在 Swift 中,从技术角度来看,为啥编译器会关心协议是不是只能用作通用约束?