内存溢出后发生了什么

本文档描述了一个仪表软件存在的读取bug,该bug导致在读取日月冻结电度索引时,仪表会频繁复位。问题分析发现代码存在范围越界,导致内存溢出,影响了EEPROM的数据读取。修复措施包括代码修改和仿真验证,证实修改后功能恢复正常。建议在执行减操作时避免溢出,确保数据安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

I.问题现象、

2022年5月13日,接开发人员反馈,某仪表代码存在读取bug,当读取日,月冻结电度索引时,会导致频繁复位。也即发送01 03 29 00 00 01 CRCH,CRCL。报文时,仪表会产生复位现象。
经检查,仪表A会产生日冻结,月冻结,最值冻结数据错乱现象,仪表B 会导致复位现象。

II.问题分析

一、故障复现:
发送报文:
在这里插入图片描述报文正常应答。报文发送过后,日冻结,月冻结,最值冻结数据错误,EEPROM上电读取错误次数错误。 其余数据正常。如下:日,月冻结。
在这里插入图片描述
最值日冻结
在这里插入图片描述

最值月冻结在这里插入图片描述
运行参数:
在这里插入图片描述
软件复位后:除了记录产生过错误,其他数据均正常。
错误次数不再增加,日月冻结及最值冻结数据恢复。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二、故障分析:
1、查看代码,发现代码存在范围越界bug,如下:
在这里插入图片描述
修改如下:
在这里插入图片描述
2、代码修改及举一反三。
在这里插入图片描述
修改如下:(2700 2900 均修改。)
在这里插入图片描述
3、仿真验证
修改前:
发生溢出后,接口调用EEPROM读取指针为空。实际未读取,默认应答发送缓冲内数据,也即上次数据。
在这里插入图片描述
不发生错误,实际数据应该如下:
在这里插入图片描述
相关存储内存大小为124字。static WORD16 sg_awComBuf[124];
发生错误后,内存地址从2DA0开始,自2EC6地址溢出,发生错误。总计126字,溢出。最大地址到2FA2
在这里插入图片描述
查看MAP文件,查到相关地址分配为
sg_ptComReg 0x10002f88 0xe0 Data Lc modbus.o [1]
sg_ptDevList 0x10002e98 0xf0 Data Lc Interface.o [1]
sg_awComBuf 0x10002da0 0xf8 Data Lc modbus.o [1]
正是接口文件溢出地址。
在这里插入图片描述
实际被错误改写的接口地址只有EEPROM。如下所示:
在这里插入图片描述
正常的分配如下图:
在这里插入图片描述
sg_ptDevList 数据被覆盖后,无法恢复。只能复位/重启 进行恢复。
继续排查,上述数据被修改后,发生EEPROM存储也会一致失败,跟故障情况相符。

综上,数据只是显示错误,实际并未错误,设计上重要的数据存在FRAM中,EEPROM仅用作重要数据备份以及一些不重要的数据存储。
相关数据如下:
在这里插入图片描述
发生异常后,上述数据无法正常读写。

修改后:
验证功能正常。

III.解决措施

临时措施:
1、改bug实际使用中不会发生,测试存在bug,已出货产品,库存品均不处理。

   永久措施

1、代码修改,试流,变更。

IV.总结建议

  执行减操作时,需要避免溢出情况的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值