调试笔记--keil 断点调试小技巧

Posted 不咸不要钱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调试笔记--keil 断点调试小技巧相关的知识,希望对你有一定的参考价值。

调试笔记–keil 断点调试小技巧

给变量打断点

调试不熟悉的项目时,卧槽!怎么这么多全局变量?这玩意又在那修改了??这个时候会给变量打断点就能省好多事。

  1. 将要监视的全局变量添加到watch窗口
    在这里插入图片描述
  2. 选中要监视的全局变量,右键设置断点
    在这里插入图片描述
  3. 设置断点条件

Expression: 设置断点条件, 表达式可以使用 == > < ! ,当条件为真时, Count 减一
Count:设置次数,当 Expression 为真 Count 减一,当Count为0时触发断点效果
Access:何时去判断表达式 Expression,如果勾选Read,则读变量时就会去判断表达式Expression,同理,勾选Write后,每当写变量时就回去判断表达式
Size、Bytes、Objects一般默认即可。
设置完后按Define即可设置断点。

在这里插入图片描述
4. 删除断点

打开debug菜单下的Breakpoints选项

在这里插入图片描述

选中要删除的断点, 点击Kill Selected

在这里插入图片描述

例子

当写入xiaoMing.age变量10次后触发断点

在这里插入图片描述

当变量 xiaoMing.age 等于 10时,触发断点

在这里插入图片描述

注意事项

  1. 给变量打断点的前提是,这个是全局变量

打断点其实就是DEBUG模块检测固定RAM地址,当有指令用的预定的RAM地址,将指令进行替换,局部变量存放在栈中,地址不固定因此不能这样操作。全局静态变量的作用域只是当前文件内可访问,因此如果强行使用可能导致结果不确定(有可能按照预期断点停止,也有可能不会)

既然原理是检测固定RAM地址,那么直接从Menory找到对应地址设置断点也是一样可行的

在这里插入图片描述

  1. 不可修改

断点设定好后,如下图,想要修改成只在写入时检测,即去掉Read的勾选,需要将改断点删除然后重新设置一个,不能在原来的上面进行修改。
在这里插入图片描述

  1. 遇到如下错误,一般是当前变量已经设置了断点,有些表达式不能重复设置断点,入下图的==
    在这里插入图片描述
  2. 断点数量

断点分为软件断点和硬件断点,硬件断点数量由单片机内部硬件决定,实测M3、M4、M7内核是8个硬件断点,软件断点是调试器根据一定算法,动态的设置硬件断点,或者在调试过程中动态修改FLASH,达到断点数量无限制效果。

  • 手头有个CMSIS-DAP(第一代DAP)实测不支持软件断点,只由硬件按断点,当断点超出后MDK会给出提示

CMSIS-DAP 实在是需要软件断点,可以手动在需要加断点的代码前加上 __asm(“BKPT 0”); 可以无限个,但是在正式代码中一定记得剔除

  • jlinkV9 支持软件断点,但是软件断点可能会动态修改flash内容(本质也是添加 __asm(“BKPT 0”); 语句,只是由jlink自动添加)

MDK5断点调试,有时候断点乱跳,就有可能是用jlink调试 断点设置多了,jlink会修改flash内容,这个时候如果直接拔掉jlink,flash中就会保存断点信息,会影响正常运行而且下次调试时如果没有更新程序,mdk里面不会显示该断点,但是断点信息已经在flash中了,执行到对应语句依然会暂停

在这里插入图片描述

缺点

需要实时监听RAM,所以调试时运行速度慢,不适合和实时性要求较高的外围模块一起联调

以上是关于调试笔记--keil 断点调试小技巧的主要内容,如果未能解决你的问题,请参考以下文章

调试笔记--keil 测量周期小技巧

delphi调试技巧

Chrome调试折腾记_JS断点调试技巧

Qt入门教程Core篇断点调试及调试技巧

调试笔记--keil printf小技巧

在keil uvision(RVMDK)下使用stlink断点调试教程