3、断点高级技巧:断点日志、命中次数、线程过滤与组管理
调试这事儿,说白了就是跟代码的「灵魂」对话。普通断点就像在门口堵人,每次路过都得停下来问问。但有时候,我们不需要这么粗暴的方式。
我个人习惯把断点分成两类:一类是「我要亲眼看看这里发生了什么」,另一类是「我想知道这里有没有发生过」。后者,就是今天要聊的高级技巧。
3.1 断点日志(Tracepoint)—— 不中断的「偷听」
先说说断点日志。Qt Creator 里叫 Tracepoint,有些地方也叫「日志断点」。它不会让程序停下来,只是在命中的时候打印一条消息。
我在项目中遇到过一个大坑:一个信号槽连接在循环里被触发了上万次。如果用普通断点,你得点「继续」点到手抽筋。用 Tracepoint 就舒服多了——让它自己打印,我喝杯咖啡回来看日志就行。
i = {i},Qt Creator 会自动替换成当前值。这个语法跟 qDebug() 不一样,别搞混了。
怎么设置?很简单:
// 在行号右侧右键 → 添加断点 → 勾选「记录消息」
// 或者:右键断点标记 → 选择「编辑断点」
// 然后在「消息」栏里写:进入函数 processData,参数值 = {value}
嗯,这里要注意:Tracepoint 的日志是输出到「应用程序输出」面板的,不是控制台。我第一次用的时候找了半天,以为没生效。
3.2 断点命中次数 —— 让断点「挑食」
有时候,一个 bug 只在第 100 次循环时才出现。你总不能手动点 99 次「继续」吧?
断点命中次数就是干这个的。你可以设置:
- 等于 N 时中断:比如第 5 次命中时停下来
- 大于等于 N 时中断:从第 10 次开始每次都停
- 取模 N 时中断:每 3 次停一次,适合周期性检查
实战场景: 我曾经调试一个内存泄漏问题。有个对象在循环里被反复创建,但只在前 50 次正常,第 51 次开始泄漏。我设置命中次数为「大于等于 50」,然后直接跳到问题发生的地方。省了至少半小时的重复点击。
设置方法:右键断点 → 编辑断点 → 在「条件」里选择「命中次数」模式。
3.3 断点过滤线程 —— 别让所有线程都来烦你
多线程调试是最头疼的。你想想看,四个线程同时跑,每个都命中断点,调试器得切换多少次上下文?
断点过滤线程,就是告诉调试器:「我只关心线程 A,其他线程别来打扰我。」
具体做法:
// 在断点条件里写:
// 假设你的线程有名字
thread()->objectName() == "WorkerThread1"
// 或者用线程 ID
QThread::currentThreadId() == 0x1234
我个人习惯给每个工作线程起个名字:
QThread* thread = new QThread;
thread->setObjectName("DataLoader"); // 起名字很重要
// 然后在断点条件里过滤:thread()->objectName() == "DataLoader"
3.4 断点组管理 —— 把断点管起来
项目大了以后,断点会越来越多。十几个断点散落在各个文件里,想临时禁用一组都不方便。
断点组就是用来解决这个问题的。你可以:
- 把相关的断点放到一个组里(比如「登录模块组」、「网络请求组」)
- 一键启用/禁用整个组
- 给组设置条件,组内所有断点共享这个条件
操作步骤:
- 打开「断点视图」(菜单栏 → 窗口 → 视图 → 断点)
- 右键空白区域 → 新建断点组
- 把断点拖进去,或者右键断点 → 移动到组
- 右键组名可以重命名、设置颜色标记
3.5 知识体系总览
下面这张图,是我自己总结的断点高级技巧关系图。你可以看到,四个技巧分别解决了不同的问题:
这四个技巧,说白了就是让断点学会「挑活干」。该停的时候停,不该停的时候别烦我。我刚开始用 Qt 调试时,只会用普通断点,后来发现高级技巧能省下 70% 的调试时间。
你想想看,如果每次调试都要手动点几百次「继续」,那跟搬砖有什么区别?
一句话总结: 断点日志帮你「偷听」,命中次数帮你「挑时机」,线程过滤帮你「选对象」,组管理帮你「管全局」。这四个组合起来,调试效率翻倍。
可可精品资料库