深入探讨一下如何打断点?

Posted 嵌入式大杂烩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入探讨一下如何打断点?相关的知识,希望对你有一定的参考价值。

对于程序员来说,debug的时间往往比写程序的时间还要长。尤其对我这种专写bug为主的程序员来说,正确使用断点调试是提高效率的有效方法。今天我们聊聊如何高效率的断点调试,由于工作中IAR为主力IDE,本篇文章主要以IAR为主。

01

普通断点

打开IDE,如下图,我们想在程序运行到第104行时停止运行,我们在下图中104行号前单击,这时该语句上将出现红色的断点标记。如下图:

或者点击要设置断点的语句,按鼠标右键,选择Toggle Breakpoint (Code)。

02

条件断点

除了上述最普通的断点外,有时候我们需要断点在一定条件下触发,例如上面的代码,希望在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同时满足时,如果将断点打到其他行也是一样的效果,如下图:

03

数据断点

看完上面的描述,有些同学就要问了,如果我就想要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是不支持的。

04

总结

在新建断点时,还有log,Datalog等等,这些我用得不多,上面主要介绍了我常用的打断点的方式,希望对大家有帮助,原创分享不易,大家喜欢的话,点个在看,不想点在看,点个赞也可以。

往期推荐:

分享一个嵌入式编程模板

嵌入式编程:由 C语言到 C++

在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总。

点击阅读原文,查看更多分享

以上是关于深入探讨一下如何打断点?的主要内容,如果未能解决你的问题,请参考以下文章

关于shared pool的深入探讨-高Latch竞争案例

mysql left join的深入探讨

深入探讨vue响应式原理

深入探讨ui框架

单例模式深入探讨

关于shared pool的深入探讨转载