断点显示空心圆或提示“breakpoint ignored”说明调试器未注册断点,根本原因是调试符号未加载或调试器未连接正确可执行文件;需依次确认构建套件为debug模式、可执行文件含-g调试信息、windows下msvc项目必须使用cdb而非gdb、清理影子构建目录、断点设在可执行语句且禁用优化。

断点显示空心圆或提示“breakpoint ignored”
这是最直观的失效信号,说明调试器压根没把断点注册进去。根本原因通常是调试符号没加载,或者调试器压根没连上正确的可执行文件。
先确认两件事:
- Qt Creator 左下角构建套件(Kit)是否选中带
Debug字样的项,比如Desktop Qt 6.5.3 MSVC2022 64-bit Debug;如果显示的是Release,哪怕你改了.pro文件也没用,必须在这里手动切过去 - 构建后生成的可执行文件是否真含调试信息:在终端运行
objdump -g your_app.exe | head -n 5(Windows)或file your_app | grep debug(Linux/macOS),有输出才说明-g生效了
如果没输出,别急着调代码——先去 Projects → Build & Run → Build Steps → Make 看构建命令里有没有 -g;qmake 项目还要检查 .pro 文件里是否有 CONFIG += debug 和 QMAKE_CXXFLAGS_DEBUG += -g;CMake 项目则要确认 set(CMAKE_BUILD_TYPE Debug) 且未被覆盖。
Windows 上用 MSVC 编译却启动了 GDB
Qt Creator 在 Windows 下默认可能误配调试器:你用 MSVC 编译出的程序带的是 PDB 符号,但 Qt Creator 却调用了 GDB,而 GDB 基本读不懂 PDB,断点自然失效,日志里全是 break-insert、gdb-set environment 这类命令。
解决路径很明确:
- 打开
Tools → Options → Kits,找到你当前使用的 Kit,点开“Debugger”下拉框,确认它指向的是CDB(不是 GDB 或 LLDB) - 如果 CDB 不在列表里,去 Windows SDK 安装目录找
cdb.exe,典型路径是C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe;没装就通过 “Windows Software Development Kit” 的修改功能勾选 “Debugging Tools for Windows” - Qt 安装器里还得补装 “Qt Debug Information Files”,否则即使 CDB 路径对了,也加载不了 Qt 库的符号
装完重启 Qt Creator,再看 Global Debugger Log —— 如果出现 symchk、lm、.reload 这类命令,说明已切到 CDB 模式。
影子构建目录残留导致源码与二进制不匹配
Qt Creator 默认开启 Shadow Build,所有编译产物都扔进一个独立目录。问题在于:你改了源码,但旧的 .o、.exe 还在构建目录里,调试器加载的是旧二进制,断点自然打不到新代码行上。
Qt Creator 18.0.2 Windows x86_64 历史版本安装包,适合需要旧版本 IDE、旧项目兼容、Qt/C++ 项目维护、构建套件配置和调试环境回退的用户使用。
这不是配置问题,是状态污染,必须物理清理:
- 在 Qt Creator 中执行
Build → Clean All,再Build → Rebuild All - 更彻底的做法:直接去文件系统里删掉整个构建目录(比如
build-myproject-Desktop_Qt_6_5_3_MSVC2022_64bit-Debug),然后重新 qmake(qmake 项目)或 configure(CMake 项目) - 如果频繁遇到,可在
Projects → Build & Run → General → Shadow build取消勾选,让构建产物和源码同目录,避免路径错乱
尤其当你从 Git 切分支、pull 新代码后立刻调试,这个步骤几乎必做。
断点设在不可执行语句或优化干扰位置
断点只能打在能产生机器指令的地方。设在注释、空行、变量声明(如 int x;)、纯头文件包含行,Qt Creator 会自动灰显,不报错但也不生效。
另外,即使在 Debug 模式下,某些编译器仍可能启用轻量优化(比如 -Og),导致内联、函数折叠或行号偏移。这时断点可能“看起来在那儿”,实际指令已被重组。
稳妥做法是:
- 只在函数调用、赋值、
if条件判断、循环体内部等明确有指令生成的位置设断点 - 在
.pro文件里强制关闭所有优化:CONFIG(debug, debug|release) { QMAKE_CXXFLAGS_DEBUG += -O0 -g -fno-omit-frame-pointer } - CMake 项目加:
target_compile_options(your_target PRIVATE $:-O0 -g>)
最后注意:多线程环境下,断点可能被其他线程绕过;信号槽若用 Qt::QueuedConnection,槽函数会在事件循环中执行,断点得设在事件分发之后,而不是 connect 那一行。










