平台崩溃之operator new异常(一)-2010-5-12

2010-5-12

首先我把前段时间对于平台问题做个总结。
平台已知问题和可疑现象有下:
(1)平台无响应。本地服务器都不能连接平台服务器,telnet不上平台服务器,平台屏幕和日志已经无任何输出。
(2)平台启动初,本地服务器全连接不上平台。该现象只是偶然,但已经出现过几次了。
(3)debug调试平台,把first-chance exception设置为stop always。则平台处理382协议(本地服务器查询客户化版本号请求)出现ado的_ReocordsetPtr的open方法执行查询语句异常,而该语句是合法语句,拿到mysql上直接执行是可以查询出数据的。并且,封装的ADO访问类已经捕获了该异常,但是没有进入异常处理代码。catch(_com_error& e)不进,后面catch(...)也不进。
(4)debug调试平台,最近两次都是定位到rto插件扫描消息队列0031表时,从内存数据库(mdb)中获取该rsp(真实服务器)上的本地服务器时,ado在获取字段值时,将
  return GetFieldInfo((LPCTSTR)pField->GetName(),fldInfo);
  pField->GetName()返回_bstr_t类型
  (LPCTSTR)pField->GetName()该句会调用_bstr_的强制转换函数
  inline _bstr_t::operator const char*() const throw(_com_error)
  {
   return (m_Data != NULL) ? m_Data->GetString() : NULL;
  }
  早期发现微软的_com_util::ConvertBSTRToString函数存在问题,后面替换过comutil.h,程序将
  #include <comutil.h>改为了#include "comutil.h",使用工程下的comutil.h.
  
处理1:
前几次出现的User BreakPoint总是停在
int result = CRTOPlugin::instance()->dap_->GetOrgsOfRSP(CRTOPlugin::instance()->dap_->GetLocalServer()->GetServerID(),&orgs,sz);
而这个方法是rto插件跨库访问dap插件。rto是路由插件,dap插件是共享内存访问插件。
将该方法在rto插件内部实现,改为不调用dap插件的方法,方法如下:
int CSepSEMQ::GetOrgOfRSP(CQQ_RSPID rspid, CQQ_ORGID **orglist,unsigned int &sz){
 string mdb_dc = CRTOPlugin::instance()->mdb_dbc_.c_str();///<获取数据库连接名
 CDbAccessor* pdbor = CRTOPlugin::instance()->GetDbConnection(mdb_dc.c_str());///<获取数据库连接
 if( pdbor == NULL )
  return -1;
 string sql = LogMsg("select a.org_id orgid from tb_org a, tb_svr b where a.svr_id = b.svr_id and b.rsp_id=%d",rspid);
 CRecordset* RecordSet = pdbor->Query(adCmdText,sql.c_str());///<执行sql语句,从内存数据库中获取本rsp上的在线机构列表
 if( RecordSet == NULL ){
  CRTOPlugin::instance()->ReleaseDbConnection(pdbor);
  return -1;
 }
 vector<CQQ_ORGID> vec_orgs;
 _variant_t v_orgid;
 string strorgid;
 while(!RecordSet->IsEof()){
  RecordSet->GetFieldValue("orgid",v_orgid);
  strorgid = ExVariantToString(v_orgid);
  vec_orgs.push_back(atoi(strorgid.c_str()));
  RecordSet->Move();
 }
 pdbor->ReleaseRecordset(RecordSet);
 sz = vec_orgs.size();
 if(sz==0){
  CRTOPlugin::instance()->ReleaseDbConnection(pdbor);
  return 0;
 }
 *orglist = new CQQ_ORGID[sz];
 vector<CQQ_ORGID>::iterator iter = vec_orgs.begin();
 for(unsigned int i=0;iter!=vec_orgs.end();iter++,i++){
  (*orglist)[i]=*iter;
 }
 CRTOPlugin::instance()->ReleaseDbConnection(pdbor);
 return 0;
}

处理2:

晚上在单步调试后台线程时,突然断点停在了LAP的汇编代码处,调用栈如下图所示

在网上查找,@ILT+350(?...)这是跳转指令,可能跟栈溢出有关。怀疑是LAP的后台线程有溢出。
LAP的后台线程是检查版本升级的,现在反正不发布升级,直接把这个后台线程的代码注释掉,再观察(排除法)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值