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();
}
… //进行其他操作
}
阅读(445) | 评论(0) | 转发(0) |