Chinaunix首页 | 论坛 | 博客
  • 博客访问: 573650
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 19:35:39

1 现象:问题描述
在P产品系统测试时,发现话单数据不正确. 用户发送的媒体包是4049K, 但是在该用户的话单中记录的是6099K,而用户话单中的时长信息是正确的.
2 关键过程:根本原因分析
为什么话单不正确呢? 比实际的要多.首先分析话单的生成模型,发送终端――>服务端――>接收终端,其中服务端与话单相关的模块有话单收集模块、话单转发模块、话单生成模块.
首先单独跟踪定位话单收集模块,通过代码分析以及单元测试,没有发现问题.
其次再检查话单生成模块以及话单转发模块,均发现是正常的.在定位问题的过程中,发现系统重起后,第一次话单的数据是完全正确的,只有到了一定呼叫量过后,话单数据才开始不正确,而且一定是比真实的数据要大.此时怀疑,与话单处理相关的类的实例,是用池进行管理的,在回收池的时候没有对原来的统计数据进行清空.检查代码,终于发现此根源
XXXConference是用池进行管理的,释放时执行ReleaseConference()但是该函数没有对m_BillData数据进行清零.其中m_BillData记录的是用户流量信息.
3 结论:解决方案及效果
原因是编码人员回收池时遗漏了对部分数据进行清零,只需在下面函数增加处理即可,见下:
XXXConference::ReleaseConference()
{
 .......
m_BillData.inputOctets      = 0;  //上行流量
    m_BillData.outputOctets     = 0;  //下行流量
 m_BillData.totalOctets      = 0;  //总流量
经过上面修改后, 计费数据验证正确.
4 经验总结:预防措施和规范建议
1. 使用内存池时, 在回收池时应该对对象的相关数据进行清零.特别在使用池管理的类成员多时,应注意代码review,确保在回收到池时,类成员均已清空
2. 做好测试,特别是使用工具进行内存泄漏的检测
5 备注
6 考核点
池管理,回收
阅读(637) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~