首页 > 解决方案 > 如何调试clang C++ 编译器错误?(clang 前端命令失败,退出代码 139)

问题描述

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

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

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

有什么方法可以缩小触发此错误的代码段吗?或以其他方式从铿锵声中获取更多信息?建议放置错误报告的预处理源是巨大的。

对于上下文:我遇到了从 clang 的内部获得大量堆栈跟踪的类型(我很难解释,因为我不是 clang 开发人员),然后是“Clang 前端命令失败”消息,如截图如下: 铿锵前端bug

标签: c++compiler-errorscompiler-constructionclang

解决方案


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

有一个叫做C-Reduce的工具可以帮助你加快这个过程,但我没有亲自使用过它,我不确定你使用高级 C++ 特性是否会导致它出现问题。

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


推荐阅读