一个压力测试工具,线程数可控,每个线程中都会对同一个IXMLDOMDocument进行操作,当线程少的时候,比如100个,很少会出现问题,但是当线程数超过200,每次运行很快就会出现异常:
PowerTest_D.exe 中的 0x5880e921 处未处理的异常: 0xC0000005: 读取位置 0x00000008 时发生访问冲突
产生异常的代码每次都是对某个IXMLDOMNode的调用,比如selectSingleNode或者selectNodes,此时该IXMLDOMNode对象不为空,我认为是MSXML内部出现了问题,请问如何解决这个问题?我的IXMLDOMDocument初始化代码:
MSXML2::IXMLDOMDocumentPtr m_pXmlDoc;
HRESULT hr = CoCreateInstance(CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, (void**)&m_pXmlDoc);
不用CLSID_DOMDocument60改用CLSID_DOMDocument40或CLSID_DOMDocument都是一样的现象。
PowerTest_D.exe 中的 0x5880e921 处未处理的异常: 0xC0000005: 读取位置 0x00000008 时发生访问冲突
产生异常的代码每次都是对某个IXMLDOMNode的调用,比如selectSingleNode或者selectNodes,此时该IXMLDOMNode对象不为空,我认为是MSXML内部出现了问题,请问如何解决这个问题?我的IXMLDOMDocument初始化代码:
MSXML2::IXMLDOMDocumentPtr m_pXmlDoc;
HRESULT hr = CoCreateInstance(CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument2, (void**)&m_pXmlDoc);
不用CLSID_DOMDocument60改用CLSID_DOMDocument40或CLSID_DOMDocument都是一样的现象。
可以尝试给微软提交bug
#define LPXMLELEMENT MSXML2::IXMLDOMElementPtr
#define LPXMLNODE MSXML2::IXMLDOMNodePtr
#define LPXMLNODES MSXML2::IXMLDOMNodeListPtr
#define LPXMLPI MSXML2::IXMLDOMProcessingInstructionPtr
#define LPXMLCDATA MSXML2::IXMLDOMCDATASectionPtr
#define LPXMLERROR MSXML2::IXMLDOMParseErrorPtr
CString strFile = "D:\\Work\\PowerTest\\PowerTest\\Bin\\1.xml";
HRESULT hr = m_pXmlDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if(hr != S_OK || m_pXmlDoc == NULL)
return;
m_pXmlDoc->load(_bstr_t(strFile));然后创建1500个线程,在线程中: HRESULT hr = CoInitialize(NULL);
if(hr != S_OK)
{
AfxMessageBox("COM初始化错误!");
return FALSE;
} LPXMLNODE pRootNode = theApp.m_pXmlDoc->selectSingleNode(_bstr_t("PowerTest"));
LPXMLNODE pSettingNode = pRootNode->selectSingleNode(_bstr_t("BaseSettings"));
LPXMLNODE pMonitorNode = pSettingNode->selectSingleNode(_bstr_t("Monitor"));
LPXMLNODE pSessionNode = pMonitorNode->selectSingleNode(_bstr_t("Session"));
LPXMLNODE pColumnRoot = pSessionNode->selectSingleNode(_bstr_t("ColumnSetting"));
LPXMLNODES pColumnNodes = pColumnRoot->selectNodes(_bstr_t("Column"));
long nCount;
pColumnNodes->get_length(&nCount);
for(long i=0;i<nCount;i++)
{
LPXMLNODE pColumnNode;
pColumnNodes->get_item(i, &pColumnNode);
LPXMLELEMENT pColumnElement = pColumnNode;
_variant_t varName = pColumnElement->getAttribute(_bstr_t("ListColumnName"));
_variant_t varWidth = pColumnElement->getAttribute(_bstr_t("ListColumnWidth"));
}然后多次执行,有时就会出现错误,错误位置可能在任何一个XML操作语句