如何调试 clang C++ 编译器错误? (clang 前端命令失败,退出代码为 139)

how to debug a clang C++ compiler bug? (clang frontend command failed with exit code 139)

在尝试使用现有代码库中的 c++20 功能集成相当复杂的库时,我反复 运行 进入 clang 12.0.1 编译器错误。该库本身有彻底的单元测试,可以正确编译,我在任何相当小的例子中重新创建错误时遇到问题。它似乎只有在许多不同的元素聚集在一起时才会触发。由于库正在替换代码库中的一个核心构建块,因此很难逐步集成它并查看错误何时开始发生。

请注意,代码的集成版本在 gcc 11.2 中编译正确,因此它似乎是有效的 c++。

出于各种(法律)原因,我无法仅上传预处理代码并记录在错误报告中,因此我想 1) 找到一个解决方法,以便我可以继续我的工作,最好也 2) 理解这个错误,所以我可以在较小的示例中重新创建它,我可以提交给 clang 开发人员。

有什么方法可以缩小触发此错误的代码段的范围吗?或者以其他方式从 clang 获取更多信息?建议放置错误报告的预处理源非常庞大。

对于上下文:我 运行 喜欢从 clang 的内部获得大量堆栈跟踪的类型(我很难解释,因为我不是 clang 开发人员),然后是“Clang前端命令失败”消息,如下面的屏幕截图所示:

我建议获取触发错误的预处理源代码(即没有 #include 或任何其他预处理程序语句的单个 C++ 文件),以及尝试编译源代码的 clang 的相应命令行.然后,您可以一次简化源代码和命令行,同时仍然确保触发相同的错误,直到它非常小,与原始受法律保护的源代码不包含任何相似之处。这个简化的代码和命令行将适用于向 Clang 开发人员报告错误。

有一个名为 C-Reduce 的工具可以帮助您加快这个过程,但我没有亲自使用过它,我不确定您使用高级 C++ 功能是否会导致问题。

如果您手动简化文件,我建议您从文件的底部开始,这样您更有可能找到文件中其他任何地方都没有使用的大量函数和变量定义。 文件中可能只有一个函数触发了该错误,因此您可以删除任何未使用的函数而不触发它。 当您找到触发该错误的函数或变量定义时,您可以尽可能地简化它,然后删除它没有使用的任何定义。