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的后台线程是检查版本升级的,现在反正不发布升级,直接把这个后台线程的代码注释掉,再观察(排除法)。