最直接查看所有断点的方式是使用ctrl+shift+f8(windows/linux)或cmd+shift+f8(macos)呼出「breakpoints」对话框,该窗口完整列出断点的启用状态、文件行号、条件表达式、命中次数、日志行为等元信息。

查看所有断点的快捷入口
最直接的方式是用 Ctrl+Shift+F8(Windows/Linux)或 Cmd+Shift+F8(macOS)呼出「Breakpoints」对话框。这个窗口列出当前项目中所有已设置的断点,包括行断点、符号断点、异常断点和地址断点。
它不是只展示“有没有断点”,而是显示每个断点的:是否启用、所属文件与行号、条件表达式、命中次数限制、日志行为、依赖关系等完整元信息。
常见误操作是只盯着编辑器左侧红点看,却没意识到断点可能被意外禁用、或设置了空条件但实际不满足——这些都只能在该对话框里一眼识别。
断点被忽略?先检查「Suspend」和「Condition」
断点图标是红色实心圆,不代表它一定会暂停执行。右键点击编辑器中的断点,弹出菜单里最关键的两项是:
-
Suspend:未勾选时,断点仅触发日志或计数,但不暂停程序;很多“断点不生效”的真实原因是这里被关了 -
Condition:留空才表示无条件暂停;如果填了i == 5却在循环里调试前10次,那前4次根本不会停
特别注意:条件表达式里不能用未初始化变量,也不能引用调试时不可见的作用域(比如内联函数里的临时对象),否则条件恒为 false,断点形同虚设。
异常断点为什么没触发?看抛出位置和捕获范围
在 Ctrl+Shift+F8 对话框中切换到「Exception Breakpoints」标签页,你会看到默认启用的 std::exception 和 java.lang.Throwable 类型(取决于项目语言)。但 C++ 里真正关键的是:
- 是否勾选了
Caught exceptions:默认只停在「未被捕获」的异常上;若想在try块内 throw 的瞬间就中断,必须手动勾选此项 - 是否限定了异常类型:比如只监听
std::runtime_error,但实际抛出的是std::logic_error,那就完全不触发 - LLDB/GDB 对 C++ 异常栈展开的支持有差异:macOS 上 LLDB 通常更稳定;Linux 用 GDB 时建议开启
set unwindonsignal on防止跳过
断点信息不更新?别忘了重新加载调试会话
CLion 不会在你修改 CMakeLists.txt 或切换 build type(如从 Release 切到 Debug)后自动刷新断点状态。以下情况必须重启调试:
- 修改了编译选项(尤其是加了
-O2或-DNDEBUG)导致源码行号映射失效 - 在调试中动态加载了新模块(如插件、共享库),而断点设在尚未加载的符号上
- 使用了
Attach to Process模式,但目标进程已运行一段时间,某些符号尚未解析
此时即使 Ctrl+Shift+F8 显示断点存在,实际调试器也看不到它们——最简单的验证方式是看 Debug 工具栏里「Frames」面板是否能展开调用栈;如果全是 ??,基本就是符号没加载全。











