在 Xcode 中以发布模式编译 .cpp 文件时,clang 崩溃了,但在调试模式下却没有问题。

4
我有一个项目,其中包括.h、.cpp和桥接头文件,基本上是试图从Swift中调用一些C++代码。在调试模式下构建和运行时,一切看起来都很好。
但如果我切换到发布模式,构建失败,并且崩溃发生在clang的编译过程中。以下是错误信息:
clang: error: unable to execute command: Segmentation fault: 11
clang: error: clang frontend command failed due to signal (use -v to see invocation)
Apple LLVM version 10.0.0 (clang-1000.11.45.5)
Target: aarch64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
clang: note: diagnostic msg: PLEASE submit a bug report to http://developer.apple.com/bugreporter/ and include the crash backtrace, preprocessed source, and associated run script.
clang: note: diagnostic msg: 
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /var/folders/r5/bs8mgc751_bbl3gcths89jc00000gp/T/CBaseMath-8e4bd0.cpp
clang: note: diagnostic msg: /var/folders/r5/bs8mgc751_bbl3gcths89jc00000gp/T/CBaseMath-8e4bd0.sh
clang: note: diagnostic msg: Crash backtrace is located in
clang: note: diagnostic msg: /Users/kelvinchan/Library/Logs/DiagnosticReports/clang_<YYYY-MM-DD-HHMMSS>_<hostname>.crash
clang: note: diagnostic msg: (choose the .crash file that corresponds to your crash)
clang: note: diagnostic msg: 

在按照指示尝试提交错误报告给苹果之前,我是否需要注意一些事情?我尝试查看了.crash文件,但是我不够技术娴熟,无法理解它。该文件未引用我所拥有的任何C ++代码。


3
这并不是你程序中的错误,而是编译器中的错误。所以你不需要寻找任何东西。尝试创建最小的可以复现崩溃的程序(即需要创建一个 MCVE)。然后按照编译器提供的报告开发人员的指示进行操作。 - Some programmer dude
2
@Someprogrammerdude,好的,听起来不错。我会删除所有的Swift内容,只编译那个单独的cpp文件,并系统地缩小代码范围。 - kawingkelvin
MCVE可能已经揭示了哪一部分代码引发了clang bug。如果没有,您可以尝试使用GCC(可能需要先安装)以完全相同的编译器设置编译此MCVE(只要GCC和clang兼容,但在相当范围内是这种情况)。如果它不包含相同的错误,您可能会在GCC的编译日志中获得一些提示,这些提示可能会帮助您找到解决方法,以便您可以继续开发,直到clang被修复。或者,作为另一种解决方法,您可以继续使用GCC... - Aconcagua
值得一提的是,您可以在 https://godbolt.org/ 上尝试重现它。这也让您快速找出错误是否仍存在于最新版本中。 - Max Langhof
1个回答

3
你的编译器出现了崩溃,这很烦人。记录错误日志最好的方法是尽可能地减少错误发生时的情况。
最好的方法是使用一个叫做 Creduce 的程序。它需要一个文件和一个脚本。文件是你的起始状态。脚本需要证明你的错误仍然存在。
在这种情况下,你的脚本可以涉及到2个编译命令和检查返回代码。文件只是你的 .CPP 文件。
有了所有这些,程序就会丢弃代码...并尽量减少文件大小。我见过100,000行被减少到5行。
一个技巧:预处理文件虽然自包含,但文件更大,这使得减少文件更容易。
最后,你需要很多时间。你开始运行程序直到它被简化。
如果它在五分钟内运行完毕,则说明你的脚本有问题,通常你最终会得到一个空的 .CPP 文件。预期的时间在几个小时之内。

我最终没有记录错误。我找到了一个解决方法,涉及注释掉一些#pragma ... interleave... 仓库的作者接受了这个更改。.cpp文件的长度仍然可以管理,我可以手动提取有问题的子集。无论如何,感谢您的建议。 - kawingkelvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接