调试笔记--keil 断点调试小技巧
Posted 不咸不要钱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调试笔记--keil 断点调试小技巧相关的知识,希望对你有一定的参考价值。
调试笔记–keil 断点调试小技巧
给变量打断点
调试不熟悉的项目时,卧槽!怎么这么多全局变量?这玩意又在那修改了??这个时候会给变量打断点就能省好多事。
- 将要监视的全局变量添加到watch窗口
- 选中要监视的全局变量,右键设置断点
- 设置断点条件
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时,触发断点
注意事项
- 给变量打断点的前提是,这个是全局变量
打断点其实就是DEBUG模块检测固定RAM地址,当有指令用的预定的RAM地址,将指令进行替换,局部变量存放在栈中,地址不固定因此不能这样操作。全局静态变量的作用域只是当前文件内可访问,因此如果强行使用可能导致结果不确定(有可能按照预期断点停止,也有可能不会)
既然原理是检测固定RAM地址,那么直接从Menory找到对应地址设置断点也是一样可行的
- 不可修改
断点设定好后,如下图,想要修改成只在写入时检测,即去掉Read的勾选,需要将改断点删除然后重新设置一个,不能在原来的上面进行修改。
- 遇到如下错误,一般是当前变量已经设置了断点,有些表达式不能重复设置断点,入下图的==
- 断点数量
断点分为软件断点和硬件断点,硬件断点数量由单片机内部硬件决定,实测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 断点调试小技巧的主要内容,如果未能解决你的问题,请参考以下文章