CLion教程-检查已暂停的程序
在调试器会话启动后,程序会正常运行,直到以下情况之一发生:
- 触发了断点
- 您手动暂停了程序
在这之后,程序会被暂停,允许您检查其当前状态、控制其进一步执行,并在运行时测试各种场景。
如果您意外关闭了“Debug”工具窗口,请从主菜单中选择“View | Tool Windows | Debug”或按Alt+0+5重新打开它。
帧和线程
程序的状态由帧表示。当程序暂停时,当前的帧堆栈会显示在“Frames”窗格中。
单击以隐藏系统/库帧:
每个帧对应于活动的方法或函数调用。它存储了被调用方法或函数的局部变量、参数以及使表达式评估成为可能的代码上下文。
每次调用方法时,都会将新帧添加到堆栈的顶部。当方法的执行完成时,相应的帧将按照后进先出的方式从堆栈中删除。
检查帧有助于您理解为什么会将特定参数传递给方法以及在调用时调用者的状态是什么。
模块名称
在某些情况下,代码可以编译为不同的模块,比如模板函数。您可以从模块名称了解代码当前在哪个二进制文件中执行。
右键单击“Frames”窗格的任何位置,然后选择“Show Module Name”:
- 模块名称将显示在堆栈帧条目的旁边:
- 模块名称将显示在堆栈帧条目的旁边:
线程
您可以浏览应用程序线程的列表。操作系统在线程启动时分配的线程ID可帮助您识别您感兴趣的线程。
线程图标
每个线程旁边的图标表示相对于当前调试会话的线程状态。
图标 | 描述 |
---|---|
当前处于暂停状态的线程。 | |
已暂停的线程。当线程被调试器暂停时,线程会标记为已暂停。 |
冻结/解冻单个线程
在CLion中,您可以在调试时暂停和恢复线程。
使用“Debug”工具窗口中线程视图上的上下文菜单或主菜单中的“Run | Debugging Actions”:
- 冻结 ... 和解冻 ... – 冻结和解冻当前选择的线程。
- 冻结其他线程 – 冻结除当前选择的线程外的所有其他线程,如果之前已冻结当前选择的线程,则解冻它。
- 解冻所有线程 – 恢复所有线程的执行。
所有四个冻结/解冻操作仅在LLDB上可用,包括Windows上的MSVC LLDB。
对于GDB,只有“冻结其他线程”和“解冻所有线程”有效。此外,对于GDB,在Windows上不支持这些操作,因此被隐藏。
复制堆栈到剪贴板
- 要复制当前线程的调用堆栈,请在“Frames”窗格的任何位置右键单击,然后选择“Copy Stack”。
探索和编辑变量
“Variables”窗格显示了所选帧/线程中变量的列表。检查变量可以帮助您理解程序以某种方式运行的原因。
如果查看字符串变量时遇到“error: summary string parsing error”,请尝试添加“-fno-limit-debug-info”编译器标志。
在专用对话框中查看变量
CLion允许您在专用对话框中查看变量。当您需要跟踪某个变量(或其引用的对象)并能够在帧和线程之间导航时,这很有用。
- 右键单击变量或监视,并选择“Inspect”。
设置变量值
如果要测试程序在特定条件下的行为或在运行时修复其当前行为,可以通过设置/更改变量值来实现。
- 选择一个变量,然后按F2。或者,选择上下文菜单中的“Set Value”。
- 输入变量的值,然后按Enter。
或者,您可以使用内联提示弹出窗口设置变量值。单击与所需变量对应的内联提示,展开树(如果需要的话),然后选择“Set Value”:
由于GDB/LLDB的限制,无法为
std::string
变量设置值。
作为数组查看
“View as array”操作会添加一个监视点,将指针值呈现为数组。
- 在指针变量的上下文菜单中选择“View as Array”。
指定数组大小:
所选指针的数组表示将添加到变量列表中:
导航到源代码
如果需要查看某个变量或类的声明源代码,可以直接从“Variables”窗格跳转到那里。
- 若要导航到变量声明的代码,请右键单击变量,然后选择“Jump to Source”(F4)。
- 若要导航到变量类型的类声明,请右键单击变量,然后选择“Jump to Type Source”(Shift+F4)。
评估表达式
CLion允许您在调试会话期间评估表达式,以获取有关程序状态的其他详细信息并在运行时测试各种方案。
在评估表达式时,请注意变量的范围和生命周期。所有表达式都是在当前执行点的上下文中进行评估的。
在编辑器中评估简单表达式
要快速评估表达式,请将鼠标指向编辑器中的表达式。请注意,无法使用此方法评估函数调用。
- 将鼠标指向要评估的表达式。表达式的结果将显示在工具提示中。
- 要查看结果对象的子元素,请单击或按Ctrl+F1。
如果发现值工具提示干扰,您可以增加延迟或完全禁用它们。要执行此操作,请在“设置”对话框(Ctrl+Alt+S)中转到“Build, Execution, Deployment | Debugger | Data Views”并根据需要设置“Show value tooltip”和“Value tooltip delay”选项。
在编辑器中评估复杂表达式
如果要在涉及方法调用的代码中评估表达式,或者您想要具体指定要评估的复杂表达式的部分,请使用“快速评估表达式”选项。
仅当程序在触发断点后(而不是手动暂停)被暂停时,才可以使用此选项。
- 将插入点置于要评估的表达式上(以评估最匹配的表达式)或选择其一部分(如果要明确指定要评估的复杂表达式的哪一部分)。
- 单击“Run | Debugging Actions | Quick Evaluate Expression”(Ctrl+Alt+F8)。或者,按住Alt并单击所选内容。
如果在从表达式中调用的函数内部存在断点,它们将被忽略。
您可以配置“Quick Evaluate”以在仅选择代码的情况下工作(而不使用菜单/快捷键)。请谨慎使用此选项,因为在启用时,可能会意外调用方法。
要配置在选择代码时启用“Quick Evaluate”,请转到“设置 | Build, Execution, Deployment | Debugger | Data Views”并设置“Show value tooltip on code selection”选项。
评估任意表达式
评估任意表达式是最灵活的评估选项之一。它允许您评估任何代码,只要它在当前帧的上下文中。使用此功能可以获取有关程序状态的其他详细信息并在同一调试会话中测试各种方案。
仅当程序在触发断点后(而不是手动暂停)被暂停时,才可以使用此选项。
- 如果要从某个表达式或变量开始(它当前位于您的面前,例如在编辑器中或“Variables”窗格中),请将其选择。
- 单击“Run | Debugging Actions | Evaluate Expression”(Alt+F8)。在Ubuntu上,快捷键可能不起作用。
在“Evaluate”对话框中,修改所选表达式或在“Expression”字段中输入新表达式。单击“Expand”(Shift+Enter)以修改多行代码片段。
请记住,在评估表达式后,表达式体中声明的任何变量都会超出作用域。
单击“Evaluate”(多行模式下为Ctrl+Enter)。表达式结果将显示在“Result”字段中。
- 表达式的结果来自“return”语句。如果没有“return”语句,则结果来自代码的最后一行(它甚至不必是一个表达式:一个单独的文字也可以)。如果没有有效的行来从中取值,则结果为
undefined
。如果无法评估指定的表达式,则“Result”字段会显示原因。
- 表达式的结果来自“return”语句。如果没有“return”语句,则结果来自代码的最后一行(它甚至不必是一个表达式:一个单独的文字也可以)。如果没有有效的行来从中取值,则结果为
如果在从表达式中调用的函数内部存在断点,它们将被忽略。
“Evaluate”对话框是非模态的,因此您可以将焦点切回编辑器以复制其他变量和表达式。如果需要,您还可以打开多个“Evaluate”对话框。
内联查看值
CLion会在变量使用的旁边直接显示变量的值。一旦变量值发生更改,内联视图将使用新值进行更新并更改其颜色。
您可以单击内联提示并展开它以查看属于变量的字段。在此弹出窗口中,您还可以更改变量值和添加内联监视。
内联视图默认处于启用状态。要关闭它,请在“设置”对话框(Ctrl+Alt+S)中转到“Build, Execution, Deployment | Debugger | Data Views”并禁用“Show values inline”选项。
添加内联监视
如果要使某个表达式的结果出现在特定行上,可以为该变量或表达式设置内联监视。内联监视是持久性的,并在会话重新启动后仍然处于活动状态。
- 单击指向要跟踪其字段的内联提示。
- 在弹出窗口中,选择字段,然后单击“Add as Inline Watch”。
- 如有需要,微调监视。您可以使用任何有效的表达式作为监视。
- 按Enter键,内联监视将显示在同一行上:
您在编辑器中设置的内联监视也会显示在“Debug”工具窗口的“Variables”窗格下的“Inline Watches”中:
要删除内联监视,请将鼠标悬停在监视上,然后单击其旁边的叉号。
观察
Watches (观察) 是用于跟踪变量或更复杂表达式结果的功能。这在需要添加一些不经常显示在变量列表中的内容,或者需要在每一步之后查看某个实例变量而无需展开树形结构时非常有用。
请注意,这个选项仅在程序在命中断点后暂停(而不是手动暂停)时才可用。
观察是在所选帧的上下文中评估的。当观察超出上下文或无法编译时,它们无法被评估。在这种情况下,观察会被标记为错误图标 。
默认情况下,观察与变量一起显示在“Variables”窗格中。要隐藏/显示观察窗格,可以使用布局设置中的“Separate watches”选项。
添加观察
- 在“Variables”窗格的顶部部分输入表达式,然后单击“Add to Watches”。
如果您要跟踪的变量或表达式已经在您面前(例如,在代码编辑器中),您可以选择并将其拖放到“Variables”窗格中。对于当前上下文中的变量,您还可以在“Variables”窗格中右键单击它们,然后选择“Add to Watches”。
一旦将变量/表达式添加到观察中,它们将保留在那里,并在每一步中进行评估,为您提供当前上下文中的结果。
编辑观察
- 右键单击所需的观察,然后选择“Edit”。
删除观察
- 要删除单个观察,右键单击它,然后选择“Remove Watch”。或者,选择观察,然后在“Variables/ Watches”窗格上按Delete键。
- 要删除所有观察,请在“Variables/ Watches”窗格的任何位置右键单击,然后选择“Remove All Watches”。
观察允许执行与变量相同的操作。例如,您可以在专用对话框中查看它们,或者使用它们导航到源代码。
观察是您项目的一部分。这意味着您可以停止并重新运行调试会话,而不必担心丢失它们。
返回到当前执行点
检查程序状态涉及在代码中导航,通常需要返回到程序暂停的地方。
执行以下操作之一:
- 转到“Run | Debugging Actions | Show Execution Point”。
- 按Alt+F10。
- 单击调试工具窗口的步进工具栏上的。
当前执行点用蓝线表示。该行的代码尚未执行。