peakzhang 发表于 2007-12-24 23:27:15

ACE_GUARD引起的崩溃错误

系统环境:
windows xp/2003,ACE 5.5.0版本
现象:
release条件编译的程序,在进入了使用ACE_GUARD宏的函数后崩溃,每次都如此。
调用:
int CServerTask::svc(void)
{
//* \brief 进行消息队列的处理
ACE_Message_Block *msg_blk = 0;
while(true)
{
if(getq (msg_blk) == -1)
{
   //错误,退出,否则将阻塞
   break;
}
//判断网络是否处于连接状态
bool bConn = SERVER_CONNECTOR::instance()->is_connected(); //每次都崩溃
}
}
bool CServerSyncConnector::is_connected()
{
ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex,guard,m_lock,false);
//报告存取违例,程序退出
return (fConn== CONN_READY);
}
在google上面也有人报告过类似的问题,但是没有人找到问题的原因。

peakzhang 发表于 2007-12-24 23:27:23

进一步的细节信息,
经过对release崩溃时候的跟踪发现,是在ACE_Guard类的acquire()方法里面出错的。
int acquire()
{
return owner_ = lock_->acquire();
}

peakzhang 发表于 2007-12-24 23:27:29

这段函数最后调用应该就是EnterCriticalSection,cs结枸被改写或者在内存中不存在。

peakzhang 发表于 2007-12-24 23:27:35

但是这个函数是在一个ACE_Singleton中调用的,按道理不会被清理的呀?真是奇怪的问题,困扰了我一周了。

peakzhang 发表于 2007-12-24 23:27:43

问题找到了。压根和这个ACE_GUARD没有丝毫关系 - 前面的操作中,加解密操作导致了内存被破坏,造成这个错误。我逐个分隔了问题,最终发现了这个原因。看来这种错误,要多从内存操作入手来查找。奇怪的问题,经常有最简单的答案。
页: [1]
查看完整版本: ACE_GUARD引起的崩溃错误