当前位置:首页 > > 嵌入式案例Show
[导读]在基于KEIL的项目开发过程中,会遇变量值与预设的运行结果不一样,在挂上仿真器debug了n个小时,排除了所有逻辑问题后,发现似乎这个值被意外更改了,但是要找到是谁修改了他却不好下手。

01

前言

在基于KEIL的项目开发过程中,会遇变量值与预设的运行结果不一样,在挂上仿真器debug了n个小时,排除了所有逻辑问题后,发现似乎这个值被意外更改了,但是要找到是谁修改了他却不好下手。现提出一种查找此类问题的方法——利用map文件查找越界。

02

MAP文件输出

首先需要设置map的输出,在MDK-ARM的Option for Target—Output Listing的标签页中设置需要输出的map文件内容,如图:

03

MAP文件分析


在工程编译完成后在设置的目录下会生成项目名.map的文件。大致来说map到可以分为如下几个部分:

  • Section Cross References:模块、段的交叉引用关系;

  • Removing Unused input   sections from the image:移除未使用的段;

  • Image Symbol  Table:映射符号表,列出了各个段所存储的对应地址;

  • Memory Map of the image:映像的内存分布;

  • Image component sizes:映像组组件大小。

解决越界数据修改问题我们主要关注的是Image Symbol Table部分。例如:

含义为:

  • Symbol Name:符号名称

  • Value:存储对应的地址;

    0x0800xxxx指存储在FLASH里面的代码、变量等。

    0x2000xxxx指存储在内存RAM中的变量Data等。

  • Ov Type:符号对应的类型

符号类型大概有几种:Number、Section、Thumb Code、Data等;

  • Size:存储大小

  • Object(Section):当前符号所在段名

现假设在调试中的一个全局变量u8 g_testFlag数值与逻辑总是不符,那么就可以怀疑被意外修改了,在map文件中搜索g_testFlag,看到在g_testFlag所在地址前是一个u8 upgradeFileName[15]。那么问题就很可能是upgradeFileName操作是越界了。

查找代码中发现存在如下操作,

memcpy(upgradeFileName,"MyUpgradeFile001.bin",21);

upgradeFileName被memcpy后,越过了它的size范围,而修改了邻近地址的g_testFlag。




免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭