2010-06-27 5 views
0

들어오는 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

+0

디버그 빌드를 만들려면 사용 가능한 소스 코드를 사용하십시오. –

+0

디버그 빌드 – JWood

+0

의 실제 스택 추적을 포함하도록 편집 된 게시물 파서 처리기 내부의 코드가 위반의 원인 일 수 있습니다. 그것이 주석 처리되면 어떻게 될까요? – Jarekczek

답변

1

는 다른 스레드에서 두 통화가 있습니까?

xmlInitParser 함수를 호출하여 라이브러리를 초기화 했습니까? xmlInitParser에 대한 누락 된 전화는 멀티 스레드 응용 프로그램에서 사용자와 같은 호출 스택을 생성합니다.

관련 문제