Constexpr 调试器
Constexpr 调试器可深入了解编译时求值,特别适用于 constexpr 和 consteval 代码。 它允许你处于编译器的执行环境中,并准确查看求值期间发生的所有情况。
目前你可以使用 Constexpr 调试器完成以下操作:
从装订区域旁点击 调试 按钮,对
static_assert(...)或constexpr声明符进行逐步调试,以检查其是如何被求值的或失败原因。可像常规调试器一样使用 相同的操作 ,如 单步进入 或 单步跳过。 另外,你还可以使用 后退一步},{ ,即编译时反向步进功能。
查看编译器可见内容:调用堆栈、本地变量、上一次返回值和当前实例化的模板参数。
将鼠标悬停在变量上可查看其值,或使用 计算表达式 ,也可通过调用堆栈跳转到源代码。
当常量求值失败时,检查整个上下文以确定发生的时间和原因。
关键调试功能
以下部分概述了调试 constexpr 代码时可执行的基本操作。
开始调试
作为代码示例,我们来看一个编译时斐波那契缓存的实现:
点击
图标,在 constexpr声明符或static_assert旁开始调试:
使用标准的 单步进入 或 单步跳过 调试器操作来求值表达式:

使用 后退一步},{ 可回溯编译时求值的每一步:

检查状态:
在编辑器中将鼠标悬停在
this->memo上,可查看数组在构造时的填充情况:
按下 Alt+F8 可求值表达式或类型:

在 面板中检查
this,如i的局部变量及近期返回值:
使用 面板查看调用堆栈并跳转到源代码:

构造函数预先计算所有斐波那契数后,可在 面板中查看结果:

诊断和修复编译时错误
当求值失败(如代码逻辑错误)时,CLion 会高亮显示该错误。 将鼠标悬停后,将弹出窗口显示问题说明:

若仍无法确定出错原因及步骤,请点击 运行求值直到失败 进行调试。 Constexpr 调试器将在失败的求值处停止,并显示错误信息和上下文。
当表达式无法在编译时求值(例如调用了非 constexpr 函数)时,CLion 会在编辑器和调试期间高亮显示错误:

限制
断点与 运行到光标处 / 强制运行到光标处 在 constexpr 求值中不受支持。
某些结构体目前尚不支持我们的 constexpr 求值器。 你可以在 YouTrack 上跟踪进度并为相关问题点赞。