我们已经开始看到一个奇怪的问题,在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
文件。除此之外,由于遗留原因,默认的Objective-C包含ProjectModuleName-Prefix.pch
(是的,我知道这很糟糕)。
这里奇怪的是handleDeferredImports
中的segfault与在Stack Overflow上发现的所有其他Swift编译器segfault问题不同。
Swift版本是4.2,我们在Xcode 10中使用了“ New Build System”(在“ Legacy Build System”上也存在段错误)。
答案 0 :(得分:0)
Swift 4编译器的解决方法是为所有构建启用Whole Module
优化。
问题本身似乎在Swift 5.0中已解决
将来任何人都可以看到此问题,请参阅https://bugs.swift.org/browse/SR-9528