들어오는 XML 스트림을 구문 분석하기 위해 libxml2 푸시 구문 분석 (SAX)을 사용했지만 처음에는 잘 작동하지만 매번 두 번째 시도에서 충돌합니다. 내 코드는 다음과 같습니다.Windows에서 두 번째로 사용하면 libxml2 충돌이 발생합니다.
xmlSAXHandler saxHandler;
memset(&saxHandler, 0, sizeof(m_SaxHandler));
xmlSAXVersion(&saxHandler, 2);
saxHandler.initialized = XML_SAX2_MAGIC; // so we do this to force parsing as SAX2.
saxHandler.startElementNs = &startElementNs;
saxHandler.endElementNs = &endElementNs;
saxHandler.warning = &warning;
saxHandler.error = &error;
saxHandler.characters = &characters;
xmlParserCtxtPtr pSaxCtx = xmlCreatePushParserCtxt(&m_SaxHandler, this, 0, 0, 0);
나는 xmlParseChunk()
을 사용하여 XML 스트림을 공급하고 데이터를 처리하기 위해 콜백을 사용하고, 구문 분석이 완료되면 xmlFreeParserCtxt(pSaxCtx)
을 호출하여 컨텍스트를 해제합니다. 내가 언급 한 바와 같이,이 모든 데이터의 첫 번째 세트에서 완벽하게 작동하지만 코드가 다시 실행했을 때 액세스 위반을 얻을, 스택 추적은 다음과 같습니다
[email protected]() + 0x99 bytes
[email protected]() + 0x168d8 bytes
[email protected]() + 0x99 bytes
[email protected]() + 0x168d8 bytes
libxml2.dll!xmlGetGlobalState() Line 716 C
libxml2.dll!__xmlDefaultBufferSize() Line 814 + 0x5 bytes C
libxml2.dll!xmlAllocParserInputBuffer(xmlCharEncoding enc) Line 2281 + 0x5 bytes C
libxml2.dll!xmlCreatePushParserCtxt(_xmlSAXHandler * sax, void * user_data, const char * chunk, int size, const char * filename) Line 11695 + 0x9 bytes C
TestApp.exe!XMLProcessor::XMLProcessor(const wchar_t * szHost=0x00d3d80c, const wchar_t * szUri=0x00d3db40, bool secure=false) Line 16 + 0x19 bytes C++
TestApp.exe!WorkerThread::ThreadProc(void * lpParameter=0x00a351c0) Line 34 + 0x15 bytes C++
kernel32.dll![email protected]@12() + 0x12 bytes
[email protected]() + 0x27 bytes
[email protected]() + 0x1b bytes
이 중요한 부분을 고정하려고 할 보인다 존재하지 않거나 손상되었지만 처음/두 번째가 아닌 방법/이유를 파악할 수 없습니다.
아이디어가 있으십니까?
감사합니다, J
디버그 빌드를 만들려면 사용 가능한 소스 코드를 사용하십시오. –
디버그 빌드 – JWood
의 실제 스택 추적을 포함하도록 편집 된 게시물 파서 처리기 내부의 코드가 위반의 원인 일 수 있습니다. 그것이 주석 처리되면 어떻게 될까요? – Jarekczek