CLion教程-断点

断点是特殊的标记,它们可以在程序执行到特定点时暂停执行,从而让您查看程序的状态和行为。断点可以是简单的(例如,在达到某行代码时暂停程序)或涉及更复杂的逻辑(检查 额外的条件,编写 日志消息 等等)。
一旦设置了断点,除了 临时断点),它会一直保留在项目中,直到您明确将其移除。
如果具有断点的文件在外部进行了修改,例如通过版本控制系统进行了更新或在外部编辑器中进行了更改,并且行号发生了变化,那么断点将相应地移动。请注意,当进行此类更改时,CLion 必须在运行时处于活动状态,否则这些更改将不会被注意到。
断点的类型
在 CLion 中有以下类型的断点:
- 行断点:在达到设置断点的代码行时暂停程序执行。这种类型的断点可以设置在任何可执行的代码行上。
- 异常断点:在抛出指定异常时暂停程序执行。它们对异常条件适用于全局,不需要特定的源代码引用。
- 符号断点:在执行特定函数或方法时暂停程序执行。
行断点的状态
在调试会话尚未开始时,所有行断点都标记为相同状态:
在调试会话期间,CLion 检测到断点的状态并相应地更改标记:
- 行断点通过提供的调试符号成功解析为 GDB 或 LLDB 调试器。在执行期间可以触发此类断点:
- 行断点无效,这意味着 GDB 或 LLDB 无法解析它,永远不会触发。当断点位于不可执行的代码之外或缺少某些调试符号时,可能会发生这种情况。CLion 准确检测到这种情况并在飞行中更新图标(例如,当加载正确的调试符号时,状态将更改)。
设置断点
设置行断点
- 单击要设置断点的可执行代码行处的行号栏。或者,将插入点放在行上,然后按 Ctrl + F8。
在 反汇编视图 中,您可以以与在源代码中设置断点相同的方式设置断点。
设置异常断点
- 单击 "查看断点"
位于调试工具窗口左侧的按钮,或按下 Ctrl+Shift+F8。
- 在 "断点" 对话框中,按 Alt+Insert 或单击
,然后选择 "异常断点" 或 "JavaScript 异常断点"。
设置符号断点
- 单击 "查看断点"
位于调试工具窗口左侧的按钮,或按下 Ctrl+Shift+F8。
- 在 "断点" 对话框中,按 Alt+Insert 或单击
,然后选择 "符号断点"。
- 指定符号名称,并选择此断点是否应在所有模块中触发,或仅在特定模块中触发。
管理断点
删除断点
- 对于非异常断点:单击行号栏中的断点。
- 对于所有断点:转到 "运行 | 查看断点"(Ctrl+Shift+F8),选择断点,然后单击 "删除"(Delete)。
为了避免意外删除断点并丢失其参数,您可以选择通过将其拖到编辑器或单击鼠标中键来删除断点。要执行此操作,请转到 "设置 | 构建、执行、部署 | 调试器" 并选择 "拖到编辑器或单击中键删除断点"。然后,单击断点将会启用或禁用它。
静音断点
如果您在一段时间内不需要在断点处停下程序,您可以将它们静音。这允许您在不离开调试器会话的情况下恢复正常的程序操作。之后,您可以取消静音断点并继续调试。
- 单击 "静音断点" 按钮
位于调试工具窗口的工具栏中。
启用/禁用断点
当您删除断点时,其内部配置会丢失。为了在不失去其参数的情况下暂时关闭单个断点,您可以将其禁用:
- 对于非异常断点:右键单击它并根据需要设置 "启用" 选项。如果没有为其 分配 删除断点,则还可以使用中间鼠标按钮切换它们。
- 对于所有断点:单击 "查看断点"(Ctrl+Shift+F8),然后在列表中选中/取消选中断点。
移动/复制断点
- 要移动断点,请将其拖动到另一行。
- 要复制断点,请按住 Ctrl 并将断点拖动到另一行。这将在目标位置创建一个具有相同参数的断点。
配置断点属性
根据断点类型,您可以配置附加属性,以满足特定需求。
- 基本断点属性可通过意图使用。将插入点放在带有断点的行上,然后按 Alt+Enter:
通过右键单击上下文菜单可获取更多断点选项:
- 单击 "更多" 或按 Ctrl+Shift+F8 访问 "断点" 对话框:
- 单击 "更多" 或按 Ctrl+Shift+F8 访问 "断点" 对话框:
断点的属性
启用
取消选中复选框以暂时禁用断点,而不从项目中删除它。禁用的断点在 步进 过程中会被跳过。
您可以配置 CLion,使其在点击而不是删除断点时启用/禁用断点。为此,请转到 "设置 | 构建、执行、部署 | 调试器" 并将 "删除断点" 选项设置为 "拖到编辑器或单击中键"。
仅使用文件名
当选中此复选框时,CLion 使用源文件的基本名称而不是其绝对路径。这更接近于您在调试器的命令行界面中指定路径的方式。
在以下情况下使用此选项:当调试器无法解析绝对路径时,例如当使用 -fdebug-prefix-map
编译程序或在构建二进制文件后将源文件移动到不同位置并丢失所需的路径映射时。
断点将在 GDB 或 LLDB 中仅使用文件名设置。这可能会导致断点匹配到多个具有相同名称的文件,因此调试器将在所有这些位置停止。
暂停
指定是否在触发断点时暂停程序执行。
非暂停断点在您需要记录某些表达式而无需暂停程序时很有用(例如,当您需要知道某个方法被调用了多少次),或者如果您需要创建一个会在触发时启用 依赖断点 的主断点。
条件
此选项用于指定每次触发断点时都会检查的条件。如果条件计算结果为 true
,则执行所选的操作。否则,将忽略该断点。
条件必须在设置断点的行处有效。
表达式的结果来自于返回语句。当没有返回语句时,结果来自于代码的最后一行。
在评估表达式时,请确保您了解其可能的副作用,因为它们可能会影响程序的行为和结果。
日志选项
当触发断点时,可以记录以下内容到控制台:
- "断点触发" 消息:例如
已达到断点:HebrewCalendar.cpp:62
的日志消息。 - 堆栈跟踪:当前帧的堆栈跟踪。如果您想要检查导致到达此点的路径,而不中断程序执行,这是有用的。
评估和记录:任意表达式的结果。
- 表达式的结果来自于返回语句。当没有返回语句时,结果来自于代码的最后一行,甚至不必是一个表达式:文字也可以。这可用于生成自定义消息或在程序执行时跟踪某些值。
- 在评估表达式时,请确保您了解其可能的副作用,因为它们可能会影响程序的行为和结果。
触发一次后删除
指定是否在触发一次后从项目中删除断点。
直到触发以下断点之前禁用
当在 "直到触发以下断点之前禁用" 框中选择了一个断点时,它会充当当前断点的触发器。这会 禁用 当前断点,直到指定的断点被触发。
您还可以选择在发生后再次禁用它,或者将其保持启用。
此选项在仅在特定条件或在某些操作之后需要暂停程序执行时很有用。在这种情况下,触发断点通常不需要停止程序执行,并且将被设置为非暂停。
抛出/捕获
对于异常断点,您可以选择在抛出异常、捕获异常或在这两种情况下都暂停程序执行。使用 "抛出时" 和 "捕获时" 复选框。