对于程序员来说,debug的时间往往比写程序的时间还要长。尤其对我这种专写bug为主的程序员来说,正确使用断点调试是提高效率的有效方法。今天我们聊聊如何高效率的断点调试,由于工作中IAR为主力IDE,本篇文章主要以IAR为主。
打开IDE,如下图,我们想在程序运行到第104行时停止运行,我们在下图中104行号前单击,这时该语句上将出现红色的断点标记。如下图:
或者点击要设置断点的语句,按鼠标右键,选择Toggle Breakpoint (Code)。
除了上述最普通的断点外,有时候我们需要断点在一定条件下触发,例如上面的代码,希望在num等于100时程序暂停。这个时候有两个最常用方法:
1、最笨的方法就是手动运行100次即可,如果是一次两次的还可以,运行100次显然不现实。
2、写一个判断语句,当num等于100时执行某个语句,把断点打在这个语句上如下:
这种方法可行,也很缺陷:当代码开了优化时,某些语句可能被优化导致断点无法运行。
这个时候,条件断点就闪亮登场了。
在打好断点之后,进入debug模式,然后在IAREWARM的选项栏选择View-> Breakpoints 窗口查看所设置的断点,右键已设置的断点,选择Edit进行配置断点。
我们希望当num等于100时暂停程序,那么我们下图红框内填写num==100。当然也可以设置(num>= 10)和(num<= 10),类似C语言中使用的==、>=、<=。
程序全速运行时,当程序运行到104行,且num等于100时就会暂停,如下图
注意我上面的用词“且”,这时候断点触发的条件时运行到104行和num等于100同时满足时,如果将断点打到其他行也是一样的效果,如下图:
看完上面的描述,有些同学就要问了,如果我就想要num等于100时暂停,不要同时满足其他条件,为什么有这样的需求呢?在实际的开发过程中,会碰到很多数据“异常”的情况,比如在一个代码量很大的工程中,有个变量突然变成1,却无法很快定位到那句代码修改的。
这时候数据断点(非官方叫法,个人叫法)就闪亮登场了。值得注意的是,数据断点只对全局变量有效。
进入debug模式,然后在IAREWARM的选项栏选择View-> Breakpoints 窗口查看所设置的断点,空白处右键选择NewBreakpoint,然后选择Data。
在1处填写num,表示要监控的变量,选择2处Enable,在3处写入0x00000064,表示当num等于100时,暂停程序。
测试结果如下
眼尖的同学可能已经注意到,Accesstype选项,我们这个选择的是Read/Write,表示无论是读操作还是写操作,当num等于100时,都会暂停程序。
当选择Read时,只有读num等于100时才会暂停程序,当选择Write时,只有写num时num等于100,才会暂停程序
对比如下图,一个停在了106行,一个停在了104行,具体原因这个是C语言的基本知识,这里不再赘述。
注意:
1、对于Cortex-M 设备,只能设置一个带有匹配数据的断点。而且这样的断点使用两个硬件断点。
2、调试设备仅限于I-jet,JTAGjet,J-Link/J-Trace 和ST-LINK,如果使用的自制的CMSIS-DAP是不支持的。
在新建断点时,还有log,Datalog等等,这些我用得不多,上面主要介绍了我常用的打断点的方式,希望对大家有帮助。
1.STM32U5,意法半导体新打造的超低功耗MCU旗舰版
2.【例说Arm-2D界面设计】从不规则图标的显示说起
3.STM8CubeMX和STM32CubeMX功能一样吗?
4.这九种情况下的单片机项目尽量不要接~
5.偷偷把室友的STM32换成了GD32后。。。
6.剖开苹果A15芯片,看看die的布局!
免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。