深入探讨一下如何打断点

开发 前端
今天我们聊聊如何高效率的断点调试,由于工作中IAR为主力IDE,本篇文章主要以IAR为主。在新建断点时,还有log,Datalog等等,这些我用得不多,上面主要介绍了我常用的打断点的方式。

[[430406]]

对于程序员来说,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等等,这些我用得不多,上面主要介绍了我常用的打断点的方式,希望对大家有帮助,

本文转载自微信公众号「知晓编程」

 

责任编辑:姜华 来源: 知晓编程
相关推荐

2009-12-23 16:13:00

WPF Attache

2009-12-01 15:48:12

提高PHP运行效率

2010-07-21 09:38:15

PHP缓存技术

2010-11-22 14:18:32

MySQL锁机制

2021-05-17 05:36:02

CSS 文字动画技巧

2009-11-20 17:17:08

Oracle函数索引

2024-05-11 08:20:23

2023-01-12 17:18:06

数据库多云

2011-02-25 09:23:00

Java类加载器

2010-03-31 14:58:03

云计算

2010-03-05 13:44:00

Python序列

2009-08-27 11:27:58

foreach语句C# foreach语

2015-09-02 08:57:56

JavaHashMap工作原理

2024-01-26 06:42:05

Redis数据结构

2012-02-28 14:43:43

2013-07-11 09:45:48

扁平化扁平化设计

2017-01-03 17:57:46

Android异步精髓Handler

2009-12-14 14:40:10

Ruby全局域变量

2009-10-16 09:17:39

屏蔽布线系统

2009-11-12 13:56:54

点赞
收藏

51CTO技术栈公众号