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

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 19:43:24

1 现象:问题描述
产品A在测试中偶然发现XXX模块乱core,提供core文件和操作日志。产品A运行环境是solaris平台。
2 关键过程:根本原因分析
dbx 分析;发现这些core都和变量 m_mapMapedAlarmConds 相关。
MAP m_mapAllAlarmConds;
Core的共同点是:从 m_mapAllAlarmConds 取得某一个 CAlarmCond 对象指针,调用该对象方法时core;而且这种core很随机和偶然,并不是每一次上述操作都会core。据此,怀疑 m_mapAllAlarmConds 中存在 CAlarmCond* 的野指针。
检视 CAlarmCond* 相关维护代码,发现如下代码可疑:
int CAlarmCondManager::AddCond(const SAlarmPara& oNewCond, int& nAlarmID)
{
    …           //进行其他操作     
 AUTO_PTR ptrAlarmCond(NULL);
 if ( 0 {
  ptrAlarmCond.reset(new CDevIDAlarmCond()); // CDevIDAlarmCond是CAlarmCond的子类 
 }
 else
 {
  ptrAlarmCond.reset(new CDevTypeAlarmCond()); // CDevTypeAlarmCond是CAlarmCond的子类
 } 
 if ( NULL == ptrAlarmCond.get() )
 {
     RETURN_ERR(ERR_ALLOC_MEM);
 }
   …           //进行其他操作
   nResult = AddOneCond(nNewAlarmID, ptrNewAlarmIDInfo, ptrAlarmCond);
 if ( 0 != nResult )
 {
     RETURN_ERR(nResult);
 }
 nAlarmID = nNewAlarmID;
 if ( 0 < oNewCond.DevID )
 {  
       nResult = RecoverOtherAlarms(oNewCond, ptrAlarmCond.get());//异常没有捕获?
//值得怀疑
                                                        //如果RecoverOtherAlarms
              //抛异常,后面的语句
//ptrAlarmCond.release();
//将得不到机会执行
//ptrAlarmCond将释放其托管的对象
         if ( 0 != nResult )
   {
           RETURN_ERR(nResult);
       }
 }
   ptrAlarmCond.release(); 
return 0;
}
。。。
int CAlarmCondManager::AddOneCond(int nAlarmID,
          AUTO_PTR& ptrAlarmIDInfo,
                         AUTO_PTR& ptrAlarmCond)
{
…           //进行其他操作
if ( m_mapAllAlarmConds.end() == m_mapAllAlarmConds.find(nAlarmID) )
 {
     m_mapAllAlarmConds[nAlarmID] = ptrAlarmCond.get();
 }
   …           //进行其他操作
}
阅读(416) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~