01前言在基于KEIL的项目开发过程中,变量值可能与预设的运行结果有所不同。
在用模拟器调试了n个小时后,排除了所有逻辑问题,似乎这个值被意外更改了,但是很难找出是谁更改了他。
现在提出一种解决此类问题的方法-使用地图文件查找界限。
02 MAP文件输出首先需要设置地图输出,在MDK-ARM的“目标-输出列表”选项卡中设置需要输出的地图文件的内容,如图所示:03 MAP文件分析位于项目编译后的设置目录将在其下生成项目名称.map文件。
粗略地讲,该地图可分为以下几部分:部分交叉引用:模块和部分之间的交叉引用关系;删除未使用的输入图像中的部分:删除未使用的部分;图像符号表:映射符号该表列出了存储在每个段中的相应地址。
图像的内存图:图像的内存分布;图像组件大小:图像组组件的大小。
为了解决越界数据修改的问题,我们主要关注的是“图像符号表”部分。
例如:含义:符号名称:符号名称值:存储相应的地址; 0x0800xxxx是指存储在FLASH中的代码,变量等。
0x2000xxxx表示存储在内存RAM中的变量Data等。
Ov类型:与符号相对应的符号大致有几种:数字,节,拇指代码,数据等。
大小:存储大小对象(部分):当前符号所在的段的名称。
现在,假设正在调试全局变量u8 g_testFlag。
它始终与逻辑不一致,那么您可以怀疑它已被意外修改。
在地图文件中搜索g_testFlag,然后在g_testFlag的地址前面有一个u8 upgradeFileName [15]。
然后可能是问题在于upgradeFileName操作超出范围。
在搜索代码中找到以下操作:memcpy(upgradeFileName,“ MyUpgradeFile001.bin”,21); upgradeFileName为memcpy后,它会越过其大小范围,并修改相邻地址的g_testFlag。
免责声明:本文内容经21ic授权后发布,版权归原作者所有。
该平台仅提供信息存储服务。
本文仅代表作者的个人观点,并不代表该平台的立场。
如有任何疑问,请与我们联系,谢谢!