日志断点是执行到该行时自动打印日志并继续运行的调试功能,区别于普通断点在于绝不中断程序;它轻量稳定,仅支持变量、简单表达式和格式化字符串,不支持复杂语句。

日志断点是什么,和普通断点有什么区别
日志断点(Log Breakpoint)不是让程序暂停,而是执行到该行时自动打印一条日志到调试器控制台,程序继续运行。它本质是「带输出的断点」,适用于想观察变量值或执行路径但又不想打断流程的场景——比如循环里每轮都看 i 值、信号触发时确认参数、或者验证某段代码是否被调用。
和普通断点最大区别在于:条件断点 可能停住程序,日志断点 绝对不停;它不依赖调试器单步逻辑,只靠调试器在命中时注入一条 printf-like 输出,因此更轻量、更稳定。
怎么设置日志断点(Qt Creator 12+)
Qt Creator 从 10.0 开始原生支持日志断点,设置方式和普通断点一致,只是属性不同:
- 先在代码行左侧空白处点击,或按
F9设置一个普通断点 - 右键该断点 → 选择「断点属性」(Breakpoint Properties)
- 在「类型(Type)」下拉菜单中选
Log Point - 在「日志(Log)」输入框里写表达式,例如:
"i = %1, str = %2"+arg(i)+arg(str)(Qt 风格),或直接写i、str让调试器自动格式化(推荐) - 勾选「启用」,关闭对话框
注意:Log Point 不支持复杂语句(如 if 或赋值),只接受变量名、简单表达式(a + b)、qDebug() 风格格式串。如果填了非法内容,调试器会忽略该日志,但不会报错。
为什么日志没输出?常见原因
日志断点看似简单,但实际常因底层调试器行为或项目配置失效:
-
debug模式未启用:Release 构建下,调试符号缺失,Log Point无法定位代码行,直接跳过 - 调试器未加载符号:检查
Debugger Log窗口是否有no debug info或symbol not found提示 - 路径映射错误:源码路径和构建路径不一致(尤其跨机器编译或使用 Docker),导致调试器找不到对应行
- LLDB/GDB 版本太旧:某些老版本 GDB(
- 日志被过滤:Qt Creator 的「应用程序输出」面板默认不显示调试器日志;必须打开「调试器控制台」(
窗口 > 输出 > 调试器控制台)才能看到
日志断点和 qDebug() 的取舍
两者都能打日志,但适用场景不同:
- 用
qDebug():需要长期保留的日志、需格式化输出、要写入文件或重定向、涉及 Qt 类型(如QString、QVariant)自动序列化 - 用
Log Point:临时诊断、不想改源码、快速验证某行是否执行、避免重复编译、调试第三方库(你不能改它的源码)
真正容易被忽略的是:日志断点的输出依赖调试器与目标进程的通信链路,一旦调试器 detach 或崩溃,日志就中断——而 qDebug() 是进程内输出,更可靠。所以线上复现问题时,别只靠日志断点。











