问题描述
OSN3500网元的SSN2EGS2单板上报"COMMUN_FAIL"告警,业务中断。检查发现是该SSN2EGS2单板异常复位导致上报"COMMUN_FAIL"告警。单板复位后业务恢复,之后未出现"COMMUN_FAIL"告警和单板异常复位。
主机版本为5.21.12.42
EGS2单板版本为2.14
告警信息
COMMUN_FAIL
处理过程
升级SSN2EGS2单板到R6C02B014(单板软件版本3.15)版本根本解决。
根因
根据现场反馈的情况,此问题是业务正常运行中,没有进行任何操作的情况下,突然出现单板复位业务中断的情况。
分析黑匣子数据,发现在处理Hello报文时,前两次处理成功,到了第三次处理的时候,出现释放内存失败异常,导致单板复位。
log日志信息:
bb1.log 2008-10-14 20:19:33 D:/3500prj/public/HardDrv/NP3454Drv/NP3454PktMng.cpp,813, Hardware operation failed ,(null)
处理Hello报文错误,需要释放内存空间。 bb1.log 2008-10-14 20:19:33 Error:0x70008, freeAddr=0x1cc8070, BufSize=0x90, dmm_intf.cpp, line:1439, ,
01cc80f0: 00000000 00000000 64656164 64656164
bb1.log 2008-10-14 20:19:33 Reset: File_NP3454PktMng.cpp, Line_859, Type_0xf0000010.
释放报文内存错误,内存释放失败
bb1.log 2008-10-14 20:19:33 Error:0x70008, freeAddr=0x1cc7380, BufSize=0x90, NP3454PktMng.cp, line:669, ,
01cc7400: 00000000 04001200 0180c200 00000000
申请报文内存错误,申请内存失败
bb1.log 2008-10-14 20:19:33 Error:0x70008, freeAddr=0x1cc7380, BufSize=0x90, dmm_intf.cpp, line:1439, ,
01cc7400: 00000000 04001200 0180c200 00000000
分析复位记录,是由于内存申请失败或是内存写越界导致。
通过分析该段代码发现:
在处理协议报文时,首先指针未初始化;其次由于内存泄漏,在用完片分和非片分后,申请失败,但是只记了level3黑匣子,未返回错或者直接重起;最后是在发送失败判断释放内存时笔误,导致内存没有释放;
由于内存泄漏,用完后别的任务申请失败就会重起;而如果pSendMsgBuf是一个没有初始化,也有没有获得空间的指针,在下面释放也有可能导致重复释放而重起;
因此,问题原因为:由于申请内存之后,在特殊的场景下没有释放内存,导致内存泄露,单板复位。内存泄露后的累计是一个长期的过程,所以复位单板之后问题消失。该问题为单板质量问题。