检查挂起的程序
调试器会话 开始后, Debug工具窗口会出现,程序正常运行,直到发生以下情况之一:
触发了一个 breakpoint
您手动 暂停了程序
之后,程序将被挂起,允许您检查其当前状态、控制其进一步执行并在运行时测试各种场景。
帧和线程
程序的状态由 frames表示。 当程序被挂起时,当前帧堆栈显示在 窗口 窗格中。

帧对应于活动的方法或函数调用。 它存储了被调用方法或函数的局部变量、其参数以及使表达式求值成为可能的代码上下文。
每次调用 函数 时,都会在栈顶新增一个帧。 当 函数 的执行完成时,相应的帧将从堆栈中移除(最后一个进,最先一个出)。
检查帧可以帮助您理解为什么特定参数被传递给方法,以及调用者在调用时的状态。
模块名称
在某些情况下,代码可以被编译为不同的模块,例如模板函数。 您可以从模块名称中了解代码在任何时刻正在哪个二进制文件中执行。
右键点击 窗口 窗格中的任意位置,然后选择 显示模块名称:

模块名称将显示在每个堆栈帧条目中:

线程
您可以浏览应用程序线程的列表。 操作系统在线程启动时分配的 ID 可以帮助您识别感兴趣的线程:

线程图标
每个线程旁的图标表示该线程的状态:
图标 | 描述 |
|---|---|
当前线程处于挂起状态。 | |
挂起的线程。 线程在被调试器暂停时会被标记为已挂起。 |
冻结/解冻单个线程
在 CLion 中,您可以在调试时挂起和恢复线程。
在 调试工具窗口的线程视图中使用上下文菜单,或在主菜单中使用 :

冻结... 和 解冻... – 冻结和解冻当前选定的线程。
冻结其他线程 – 冻结除当前选定线程以外的所有线程,并解冻之前被冻结的当前选定线程(如果有)。
解冻所有线程 – 恢复所有线程的执行。
复制堆栈到剪贴板
要复制当前线程的调用堆栈,请右键点击 帧 窗格中的任意位置,然后选择 复制堆栈。
探索和编辑变量
变量 窗格显示所选 帧/线程中的变量列表。 检查变量可以帮助您理解程序为何以某种方式运行。

在专用对话框中查看变量
CLion 允许您在专用对话框中检查变量。 这在您需要跟踪某个变量(或它所持有引用的对象)并且同时能够在帧和线程之间导航时非常有用。
右键点击变量或监视并选择 Inspect。

设置变量值
如果您想测试程序在特定数据下的行为或在运行时更改其流程,可以通过更改变量值来实现。
选择一个变量并按 F2。 或者,从上下文菜单中选择 设置值。
请输入变量的值然后按 Enter。

或者,您可以使用 内联提示弹出窗口设置变量值。 点击与所需变量对应的提示,必要时展开树,然后选择 设置值:

实例="rm"/>
查看为数组
查看为数组 操作会添加一个监视点,将指针值呈现为数组。
从指针变量的上下文菜单中选择 以数组查看。
指定数组大小:

所选指针的数组表示将被添加到变量列表中:

查看 OpenCV 图像
在调试包含类型为 cv::Mat 的二维 OpenCV 数组的应用程序时,您可以在单独的调试器对话框中将其视为图像。
调试开始并初始化 OpenCV 数组后,点击调试器 变量 窗格中变量旁边的 以图像形式查看:

一个新对话框打开:

在此对话框中,您可以更改图像的颜色格式,选择调试器步进后是否重新加载图像,将其保存为 .png 文件等。

查看其他图像类型
如果您正在处理 cv::Mat 以外的图像类型,也可以使用 OpenCV 图像查看器将其视为图像。 在这种情况下,您需要手动设置图像格式。 以下是一个示例:
要查看此图像,请右键点击 变量 窗格中的指针,并从上下文菜单中选择 以图像形式查看…:

手动配置图像的宽度、高度和其他参数:

导航到源代码
您可以从 变量 窗格导航到声明。
要导航到变量声明的代码位置,请右键点击变量并选择 跳转到源 F4。
要导航到变量类型的类声明,请右键点击该变量,然后选择 跳转到类型源 Shift+F4。
计算表达式
CLion 允许您在调试会话中评估表达式,以获取有关程序状态的更多详细信息或在运行时测试各种执行场景。
此功能仅在程序在触发断点后挂起时有效(而非 暂停)。
如果表达式中调用的方法内有断点,它们将被忽略。
在编辑器中评估一个简单表达式
要快速评估表达式,请在编辑器中指向它。 请注意,函数调用无法通过这种方式计算。
指向您要计算的表达式。 表达式的结果显示在工具提示中。

要查看结果对象的子元素,请点击
或按 Ctrl+F1。

如果您觉得数值工具提示干扰到了您的操作,您可以增加延迟时间或完全禁用它们。 为此,请在 设置 对话框(Ctrl+Alt+S )中,转到 并根据您的偏好设置 显示值提示 和 值工具提示延迟 选项。
在编辑器中评估复杂表达式
如果您想在代码中计算涉及方法调用的表达式或指定表达式的特定部分以进行计算,请使用 快速求值表达式 选项。
选择表达式并按下 Ctrl+Alt+F8 ,或从出现的浮动工具栏中选择 计算表达式。

或者,转到 ,或按住 Alt 并点击所选内容。
您可以配置 快速求值表达式 使其只在选择一段代码时运行(无需使用菜单/快捷键)。 启用此选项时请谨慎操作,因为您可能会意外调用方法。
选中代码时评估表达式
前往 并设置 在代码选择上显示值提示 选项。
计算任意表达式
评估任意表达式是最灵活的评估选项。 它允许您评估任何自定义代码,只要它在当前帧的上下文中。 使用它,您可以计算声明、方法调用、匿名类、lambda、循环等。
如果您想从当前在您面前的某个表达式或变量开始(例如,在编辑器或 变量 窗格上),请选择它。
前往 Alt+F8 或从上下文菜单中选择 计算表达式。 快捷键可能在 Ubuntu 上无法使用(为正确操作, 调整快捷键配置)。
在 计算 对话框中,修改所选表达式或在 表达式 字段中输入一个新的。 点击 展开 Shift+Enter 以修改多行代码片段。
点击 计算 (Ctrl+Enter 以进入多行模式)。 表达式结果显示在 结果 字段中。

表达式的结果取自 return 语句。 当没有 return 语句时,结果取自代码的最后一行(甚至不必是表达式:单个字面量也可以)。 当没有有效的行可取值时,结果是
undefined。 如果无法计算指定表达式, 结果 字段将指示原因。
计算 对话框是非模态的,因此您可以将焦点切换回编辑器以复制其他变量和表达式。 您还可以打开多个 计算 对话框。
内联查看值
CLion 在变量使用的旁边显示其值。 一旦变量值更改,内联视图将会更新为新值并更改其颜色。
您可以点击内联提示并展开它以检查属于该变量的字段。 在此弹出窗口中,您还可以 更改变量值和 添加内联监视。

默认情况下,内联视图是启用的。 要关闭它,请在 设置 对话框(Ctrl+Alt+S )中,转到 并禁用 内联显示值 选项。
添加内联监视
如果您希望某个表达式的结果显示在特定的行上,您可以为此设置一个内联 watch。 内联监视是持久的,并且在会话重启后仍然保持活动状态。
点击指向您想跟踪其字段的对象的内联提示。
在弹出窗口中,选择该字段并点击 添加为内联监视。

如有需要,微调 watch。 您可以使用任何有效的表达式作为监视。

按 Enter ,内联监视将出现在同一行:

您在编辑器中设置的内联监视也会显示在 内联监视 下,位于 调试 工具窗口的变量窗格中:

要删除行内监视,请将鼠标悬停在监视上,然后点击旁边的叉号。
监视
如果您想跟踪某个变量或更复杂表达式的结果,请为此变量或表达式设置监视。 当您需要计算未定期显示在变量列表中的内容,或固定某些实例变量以消除每次 单步后展开树的需要时,这非常有用。
此功能仅在程序在触发断点后挂起时有效(而非 暂停)。
在所选帧的上下文中评估 Watches。 监视在上下文之外或编译失败时无法评估。 如果是这种情况,手表将标有错误图标 。
默认情况下,监视会与变量一起显示在 变量 窗格中。 要隐藏/显示 监视 窗格,请在 布局设置 菜单中使用 分离 watches 选项。
添加监视
在 变量 窗格的顶部输入表达式,然后点击 添加到监视。

在您将一个变量/表达式添加到 监视 之后,它会保留在那里,并在每个 步骤中进行评估,为您提供当前上下文中的结果。
编辑监视
右键点击所需的监视器,然后选择 编辑。
删除监视
要移除单个监视,请右键点击并选择 移除监视。 或者,在 变量/监视 窗格中选择监视并按 Delete。
要移除所有监视,请右键点击 变量/监视 窗格上的任意位置,然后选择 移除所有监视。
监视允许执行与变量相同的操作。 例如,您可以 在专用对话框中查看它们 ,或使用它们 导航到源代码。
监视是您项目的一部分。 这意味着您可以停止并重新运行调试会话而不会有丢失它们的风险。
执行点
返回当前执行点
检查程序状态涉及在代码中导航,您经常需要返回到程序挂起的位置。
请执行以下操作之一:
在主菜单中,进入 .
按下 Alt+F10。
在 调试 工具窗口的单步执行工具栏上点击
,并在打开的上下文菜单中选择
显示执行点。
当前的执行点用蓝色线条表示。 此行代码尚未执行。
