1.问题描述
日期:2013-10-10
服务器:3#
现象:服务器启动后一段时间,不再响应客户端命令,客户端也无法登录。
会产生多个crash日志。2.分析
分析crash日志,定位到CSheet::ProcessExport函数中的: idd->FindExportRule(this->type_,&pRuleID,num);
idd为0,导致访问违例
调用发生在处理单据的2800-Indication协议处理时,即接收到单据,进一步发现是来自suibao的月表数据导致的(从src_orgid和单据类型信息)
int CSheet::ProcessExport(CMsg *msg,CSheetDealResult &sdr) {
GetThisLogger()->log(LO_FILE|LO_STDOUT,SEVERITY_DEBUG,"CSheet::ProcessExport ...\n");
int result = 0;
IDd *idd = env_->GetIDd();
CQQ_RULEID *pRuleID = 0;
size_t num = 0;
string old_dbc_name = GetDBCName(); ///< 保存原来的连接,导出过程会改变数据源(合理的方式是导出时指定数据源)
idd->FindExportRule(this->type_,&pRuleID,num);
CSheet::ProcessExport是在CLMPlugin::OnRcvSendQueueData中调用的.
对于通用处理模式,并且lm的<ExportData>配置为1的情况下才执行导出.
if (handle_mode==2) {
if (IsExportData()) {
if (sheet->GetOpType()==OM_NEW||sheet->GetOpType()==OM_UNSPECIFED) { ///< @note 导出目前只支持新增,且在主键冲突时只能采用尝试(没有导出表的关联信息和主键信息)
sheet->OnDupKey(on_dup_key_);
sheet->SetHandleProp(5);
if (sheet->ProcessExport(msg,sdr)) {
pdbor->RollbackTrans();
or.auto_resp_mq_ = -1;
goto LAB_DONE;
}
}
}
}
执行sheet->ProcessExport的前提条件是:
。单据采用通用处理,且需要导出
是否导出在lm.conf中配置
<ExportData>1</ExportData><!--是否导入数据1是 0否-->
默认:0
单据处理方式在tb_0044的f023n_0044中配置
f023n_0044 处理模式 tinyint 1 1-兼容模式 2-通用处理模式).
3.解释
。suibao月表是采用通用单据处理方式处理的(f023n_0044=2),lm.conf中
<ExportData>1</ExportDate>
idd是dd提供的接口,而托管并没有加载dd.dll。
idd因此为NULL,导致访问违例.
4.思考
。是什么原因导致的,为什么才暴露?---可能<ExportData>的配置近期修改过,恰巧接收到月表
。是否有必要增强检查
5.处理
修改lm.conf的<ExportData>配置:<ExportData>0</ExportDate>