Ozone数据断点使用
在调试程序过程中会经常用到程序断点(即程序在执行到特定位置时停下来),但本文介绍的是数据断点,用于监控内存地址及其数据的变化。这种类型的断点在调试一些疑难重症时出奇的有效。
比如某个变量的值总是不符合预期,单步执行或者程序断点又难以定位问题,或者是某一段程序莫名的被篡改,这个时候就可以考虑数据断点了。
在Ozone使用数据断点,首先需要将变量添加到watch窗口,在变量上右键选择 “Set Data Breakpoint”
在断点窗口可以看到type 为Data,程序会在变量发生变化的地方自动停下
也可以指定地址,用于监控内存
常见应用场景
- 调试被应用程序异常破坏的标志或变量
- 调试堆栈溢出,可以在堆栈栈顶接近栈大小的位置打数据断点
- 数据断点的地址可以是外设寄存器的地址,可以调试外设寄存器被误修改的场景
注意事项 - 数据断点对于“DMA对内存的修改”无效
- 数据断点对于“Debugger对内存的修改”无效
在一次debug过程中发现如果对CAN进行deinit,之后再进行flash的操作就会直接跳转到硬件错误中断
错误类型为unaligned非对齐错误。后面使用数据断点发现是将CAN接口deinit后还有别的任务在调用CAN进行发送任务,导致出现了空指针将一段代码(flash操作的程序)篡改了。可见大部分所谓的“玄学”问题都是用户代码逻辑不够严谨导致。