对于程序员来说,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等等,这些我用得不多,上面主要介绍了我常用的打断点的方式,希望对大家有帮助,原创分享不易,大家喜欢的话,点个在看,不想点在看,点个赞也可以。

点击查看本文所在的专辑,STM32F207教程

关注公众号,第一时间收到文章更新

深入探讨一下如何打断点相关推荐

  1. ajax请求必须打断点才能成功,Jquery等待ajax执行完毕继续执行(断点调试正常,运行异常)...

    以前写过一个程序,发现用断点调试的时候,一步步的运行,程序是可以的,但是去了断点程序就出现了问题. $(document).ready(function(){ var arra=new Array() ...

  2. 深入探讨Python的import机制:实现远程导入模块 | CSDN博文精选

    来源 | Python编程时光(ID:Python-Time) 所谓的模块导入,是指在一个模块中使用另一个模块的代码的操作,它有利于代码的复用. 也许你看到这个标题,会说我怎么会发这么基础的文章? 与 ...

  3. 【探讨】javascript事件机制底层实现原理

    前言 又到了扯淡时间了,我最近在思考javascript事件机制底层的实现,但是暂时没有勇气去看chrome源码,所以今天我来猜测一把 我们今天来猜一猜,探讨探讨,javascript底层事件机制是如 ...

  4. js断点和调试学习总结3

    使用Chrome调试JavaScript的断点设置和调试技巧 你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍微改进一点的方 法是用 console. ...

  5. 深入探讨this指针

    深入探讨this指针   为了写这篇文章,准备了好长时间,翻遍了箱底的书籍.可是如今还是不敢放开手来写,战战兢兢.不是操心自己写错,而是唯恐自己错误误导别人.同一时候也希望这篇文章能给你一点收获.既然 ...

  6. 探讨“临时对象”(temporary object)

    2019独角兽企业重金招聘Python工程师标准>>> MSDN中对VS2012版本的临时对象的说明如下: 在某些情况下,编译器有必要产生临时对象.     当初始化一个 常量引用 ...

  7. 【软件开发底层知识修炼】十六 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变

    上一篇文章我们学习了如何使用GDB进行软件断点调试和硬件断点调试:[软件开发底层知识修炼]十五 快速学习GDB调试二 使用GDB进行断点调试 本篇文章继续上一篇文章的学习,如何使用GDB的数据断点监测 ...

  8. 【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试

    上一篇文章我们学习了使用GDB的最基本方法:[软件开发底层知识修炼]十四 快速学习GDB调试一 入门使用 本篇文章将学习GDB的断点调试.断点调试是一种非常重要的调试方法. 文章目录 1 断点类型 2 ...

  9. 阿里P8架构师谈:深入探讨HashMap的底层结构、原理、扩容机制

    摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型. 随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化, ...

最新文章

  1. 科研超级神器,摘要页一键链接关联论文
  2. RSA加密算法原理及RES签名算法简介(转载)
  3. JavaScript中Ajax源码
  4. sstream应用举例
  5. [html] 写页面布局时你有考虑过分辨率因素吗?还要考虑哪些因素呢
  6. bootstrap 滚动 进度条_bootstrap动态进度条怎么搞
  7. 批处理中for的参数的用法
  8. 复制文件夹时同时拷贝其权限
  9. 在线SQL美化格式化工具
  10. mysql库迁移_MySql数据库 指定库迁移
  11. poj 2352 Stars 树状数组
  12. android 关闭来电铃声,Android删除除自定义铃声后,来电铃声显示是一串数字
  13. DataTable转换为ListT或者DataRow转换为T
  14. 对于现在毕业之后,大部分找不到合适的工作,转行到软件开发(大部分是JAVA)的人来说,分享下自己的经验
  15. ElasticSearch入门教程(1)
  16. WHQL认证和代码签名
  17. 高新技术企业认定领域细分有几项
  18. 百慕大财政部批准Velocity Ledger ICO申请
  19. EasyPlayer.js支持VR视频播放,TSINGSEE青犀视频全力打造网页VR生态圈
  20. anychat java_AnyChat的视频会议程序实例详解

热门文章

  1. 预览ExtJS 4.0的新功能(四):焕然一新的Store/Proxy
  2. java 蓝桥杯 求先序排列
  3. pandas标记一列为时间序列
  4. java重载中this的作用_Java2:构造方法、方法重载和this关键字
  5. 检测空指针 静态检测_动态扭矩和静态扭矩的区分及其应用
  6. 夏门大学的计算机专业排第几,厦门大学最好重点的专业在全国排名具体情况
  7. Leetcode 118 杨辉三角
  8. 第十四篇 元类编程(二)
  9. Linux CPU信息和使用情况查看(CentOS)
  10. hibench测试出现问题--zookeeper