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 编译器导入