[开发工具] STM32CubeIDE 实用技巧之条件断点的妙用

[复制链接]
1141|28
keaibukelian 发表于 2025-8-18 21:05 | 显示全部楼层 |阅读模式
1. 前言
在嵌入式项目中,我们经常会碰到各种各样的异常和故障,比如客户说,某个问题可能需要一天,一周,甚至以月为周期才能复现一次问题。诸如此类问题,着实令工程师苦恼,因为很难去捕获信息来分析和复现问题,这里给大家分享一些我的经验和技巧。

2. 方法
我们都知道调试是非常高效的分析手段,相信大家对断点(breakpoint)并不陌生,事实上,断点还可以设置条件的,当条件满足时再触发断点,这对于分析疑难杂症非常有用。

接下来我将介绍如何在 STM32CubeIDE 中使用条件断点,以及如何使用观察点。

2.1. 断点/breakpoint
断点就是当程序到达某个点时,断点可使程序暂停运行。
我们在调试界面先设置一个断点,鼠标右击该断点进入断点的属性界面,如下图所示

1.png


图1. 断点的属性

为了演示,我在断点的属性界面中,为断点增加了一则条件:(*(int *) 0x42020414 == 0x01)&&(hspi1.Init.NSSPMode == 0x40000000)。

此处的“0x42020414”就是 GPIOB 的 ODR 寄存器的地址, “0x40000000”就是
“SPI_NSS_PULSE_ENABLE”的宏定义,所以该条件的含义是:当 PB0 输出高电平时,并且SPI1 的 NSSPMode=SPI_NSS_PULSE_ENABLE 时,触发该断点,如下图所示。

2.png


图2. 设置断点的条件

如此一来,我们在调试的时候,就能看到,当且仅当上述条件满足时,程序才会停留在该断点上,如下图所示:

3.png


图3. 设置断点的条件

2.2. 观察点/watchpoint
与条件断点稍微不同,观察点也是一种特殊的断点,当表达式的值发生变化时,它会使程序暂停运行。那么如何设置观察点呢?

还是在调试界面,首先我们在 outline 界面,或者将变量添加到Variables / Expression / LiveExpression 界面,然后找到该变量,右击选择“Toggle Watchpoint”,如下图所示。

4.png


图4. 添加观察点

在之后出现的界面中,设置观察点的属性。为了演示,我这里设置了这样的条件:当 ret 变量被写入的时候,并且 ret 的值不等于 2 的时候,观察点生效,如下图所示。大家还可以根据需要,勾选上“Read”选项,就可以设置变量在被读的时候是否生效,非常的方便实用。

5.png


图5. 设置观察点的属性

添加的 watchpoint 也会放置在 breakpoint 界面中,这里可以看到所有的断点,如下图所示:

6.png


图6. 修改 APP 工程的中断向量表偏移值

然后在程序中,当全局变量 ret 的值被修改,且值不等于 2 的时候,观测点会生效,直接暂停住程序。注意这里没有设置断点。如下图所示:

7.png


图7. APP 工程的主循环

3. 小结
这些方法在调试疑难杂症时是非常有用的,但是弊端在于,必须连接仿真器进入调试模式。

在 Cortex-M3 以及更高级的内核 (如 M4,M33,M7 等) 中,对于不连接调试器的场景,我们还可以利用 SWV,以及 DWT 等调试单元来提前预埋监控程序,实现对内存/变量,以及函数的监控和调试。如“LAT1256 使用 STM32 的 DWT 单元监控内存”提供了类似的调试方法的说明。

同样,我们还可以通过 STM32CubeMonitor 来实现非侵入式的监控。

对于疑难杂症,我们的方法是非常多的,大家可以选择合适的方式来分析问题。
————————————————
版权声明:本文为CSDN博主「意法半导体STM32」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2501_92678806/article/details/150206660

OKAKAKO 发表于 2025-9-19 16:06 | 显示全部楼层
断点确实非常不错的用法
szt1993 发表于 2025-9-19 16:41 | 显示全部楼层
大家对断点(breakpoint)并不陌生,事实上,断点还可以设置条件的,当条件满足时再触发断点
vivilyly 发表于 2025-9-21 12:39 | 显示全部楼层
条件断点的调试哲学              
uiint 发表于 2025-9-21 13:22 | 显示全部楼层
使用观察点              
minzisc 发表于 2025-9-21 14:03 | 显示全部楼层
条件断点的典型应用              
earlmax 发表于 2025-9-21 14:18 | 显示全部楼层
仅在满足条件时中断,减少无关干扰。
eefas 发表于 2025-9-21 15:10 | 显示全部楼层
条件断点是一种高级调试功能,允许程序在特定条件满足时暂停执行,而不是每次运行到断点位置都停下来。
janewood 发表于 2025-9-21 17:03 | 显示全部楼层
条件断点的组合与优化​              
updownq 发表于 2025-9-21 18:52 | 显示全部楼层
断点触发后,在 Watch 窗口实时查看相关变量,快速分析上下文。
lzmm 发表于 2025-9-21 19:21 | 显示全部楼层
STM32CubeIDE 的条件断点功能通过灵活的条件设置,能够显著提升调试效率
nomomy 发表于 2025-9-21 20:09 | 显示全部楼层
定位代码行              
claretttt 发表于 2025-9-21 20:37 | 显示全部楼层
条件断点会增加调试器的计算负担,可能影响程序运行速度
uptown 发表于 2025-9-21 22:01 | 显示全部楼层
条件表达式中引用的变量在断点处是可见的。
zerorobert 发表于 2025-9-22 13:08 | 显示全部楼层
能够针对特定变量值或程序状态设置断点,精确捕捉问题所在。
macpherson 发表于 2025-9-22 13:32 | 显示全部楼层
条件表达式的性能影响​​              
uytyu 发表于 2025-9-22 13:53 | 显示全部楼层
断点条件              
fengm 发表于 2025-9-22 15:04 | 显示全部楼层
结合表达式与宏              
jonas222 发表于 2025-9-22 15:47 | 显示全部楼层
条件断点的设置方法?              
maqianqu 发表于 2025-9-22 17:37 | 显示全部楼层
避免在大量重复执行的代码中频繁暂停,直接跳转到感兴趣的执行点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

103

主题

4350

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部