断点显示空心圆或跳过说明调试器未加载符号,常见原因是Kit选错Release而非Debug,需切换至Debug Kit并清理重建;编译器须加-g或/Zi生成调试信息;MSVC项目必须配CDB而非GDB;内联函数、模板、信号槽等位置断点可能因运行时行为失效。

断点显示空心圆或直接跳过
这说明调试器压根没加载符号,或者根本没停在你设的位置。最常见原因是构建套件选错了——左下角那个下拉框里显示的是 Release 而不是 Debug。Qt Creator 默认会同时配置 Debug 和 Release 两种 Kit,但不会自动帮你切到 Debug。哪怕你改了 .pro 文件里的 CONFIG += debug,如果 Kit 没选对,照样编译出 Release 版本。
检查方法很简单:点开“Projects”选项卡 → 看“Build & Run”下的“Build”设置 → 确认“Kit”右侧显示的确实是带 Debug 字样的条目(比如 Desktop Qt 6.5.3 MSVC2022 64-bit Debug)。如果不是,手动切换过去,然后执行 Build > Clean All 再 Build > Rebuild All。
别信“我刚改完 .pro 就编译了”——Qt Creator 的影子构建目录(Shadow Build)会缓存旧的中间文件,不清理就重编,很可能还在用上一次的 Release 目标文件。
编译输出里找不到 -g 或 /Zi
没有调试符号,GDB、LLDB 或 CDB 都是瞎子。即使 Kit 是 Debug,也得确认编译器真加了调试信息开关。
对 qmake 项目,在 .pro 文件里加这两行:
CONFIG(debug, debug|release) {
QMAKE_CXXFLAGS_DEBUG += -g -O0
}
对 CMake 项目,在 CMakeLists.txt 里确保有:
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0")
Windows 上用 MSVC 编译时,-g 不生效,要用 /Zi(CMake 默认会加,但如果你手动覆写了 CMAKE_CXX_FLAGS,可能把它冲掉了);Qt Creator 的 Kit 如果选的是 MSVC 工具链,它内部会自动加 /Zi,但前提是 Kit 配置正确且没被覆盖。
验证是否真加了:打开“Compile Output”面板,搜 -g 或 /Zi;或者用命令行检查二进制:objdump -g your_app.exe(Windows)、readelf -wi your_app | grep DW_TAG(Linux/macOS),有输出才说明符号存在。
Windows 上用 MSVC 编译却配了 GDB 调试器
这是 Qt Creator 在 Windows 上一个隐蔽但高频的坑。日志里一出现 break-insert、gdb-set、-interpreter-exec 这类词,基本就是 GDB 在干活——但它根本没法正常解析 MSVC 生成的 PDB 符号,断点必然失效。
解决路径很明确:
- 确认你装了
CDB:查C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe是否存在;没有就去 Windows SDK 安装界面勾选 “Debugging Tools for Windows” - 确认 Qt Creator 的 Kit 用了 CDB:进入
Tools > Options > Kits,选中你的 MSVC Kit → 点开“Debugger”下拉框 → 必须选CDB,不能是GDB或留空 - 确认装了对应 Qt 版本的
Debug Information Files:用 Qt Maintenance Tool 安装,否则 CDB 找不到 Qt 自身的符号,连QApplication::exec()都进不去
换完调试器后必须重启 Qt Creator,否则设置不生效。
断点设在内联函数、模板实例化或信号槽连接处
这类位置断点容易“失效”,不是配置问题,而是运行时行为导致的。比如:
- 你在
QPushButton::clicked()信号连接的 lambda 里设断点,但槽函数是 queued connection(跨线程),实际执行发生在事件循环里,调试器可能没跟进去 - 你在某个模板函数内部设断点,但编译器把该实例完全内联了,源码行和机器码不对应
- 你在
Q_OBJECT类的构造函数第一行设断点,结果断在了QObject基类初始化之前,调试器还没准备好符号
应对办法很实在:先在 main() 第一行设个断点,F5 启动看能不能停;能停,说明环境没问题,再逐步往业务逻辑里挪;不能停,就回到前面三步重查。遇到信号槽问题,临时改成 Qt::DirectConnection 测试,或者在事件循环前加个 qDebug() 打桩验证执行流。
真正麻烦的是混合构建:一部分库是 Release(没符号),一部分是 Debug(有符号),这时断点进第三方库就灰显。这种情况下,要么自己编译所有依赖为 Debug 版,要么接受“只能在自己代码里断点”这个现实——别在 QPainter::drawRect() 里硬设断点。


















