【发布时间】:2018-12-16 12:26:03
【问题描述】:
我们已经开始看到一个奇怪的问题,不知从何而来,编译器在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 中使用“新构建系统”(它也在“旧版构建系统”上存在段错误)。
【问题讨论】:
-
你试过了吗?步骤1)您可以从项目中删除一半文件,确保其余文件编译(不必是正在运行的程序),然后查看问题是否仍然存在。如果您修复了它,请移除另一半。第 2 步)尽可能多地执行第 1 步。 - 你需要一些版本控制(本地 git repo 就足够了),因为会有一些试验和错误..
-
编译器崩溃始终是编译器中的一个错误,因此您肯定想在 bugs.swift.org 上打开一个缺陷。它肯定与桥接头有关,因此删除这将是一个很大的开始(我的意思是以与@Michael 相同的方式删除;暂时,注释掉任何依赖它的东西,看看你是否可以在什么时候得到东西编译)。
-
请务必删除 DerivedData。这确实感觉像是可以修复的那种崩溃。
-
否; Xcode clean 与删除 DerivedData 不同。 “清理构建文件夹” (Cmd-Shift-Opt K) 很接近,但即使这样也没有删除 DerivedData 强大。
-
关于 Michael 的方法,虽然很困难,但我过去在大型项目中就是这样做的。它不会可靠失败的事实表明,您可能需要使用
xcodebuild编写脚本以尝试重复构建,以查看是否可以找到会导致问题的可靠构建数量。无论如何,您都必须寻找“在这种情况下有效,但在这种情况下无效”的情况才能解决它。