对于程序员来说,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等等,这些我用得不多,上面主要介绍了我常用的打断点的方式,希望对大家有帮助,
本文转载自微信公众号「知晓编程」