在Windows上第二次使用libxml2崩溃

我一直在使用libxml2 push parsing(SAX)parsing一个传入的XMLstream,这个工作很好,但每次都会崩溃,我的代码如下所示:

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() XMLstream,并使用callback来处理数据,一旦parsing完成,我调用xmlFreeParserCtxt(pSaxCtx)来释放上下文。 正如我所提到的,这一切都完美的第一组数据,但是当代码再次运行,我得到一个访问冲突,堆栈跟踪是:

 ntdll.dll!_RtlpWaitOnCriticalSection@8() + 0x99 bytes ntdll.dll!_RtlEnterCriticalSection@4() + 0x168d8 bytes ntdll.dll!_RtlpWaitOnCriticalSection@8() + 0x99 bytes ntdll.dll!_RtlEnterCriticalSection@4() + 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!@BaseThreadInitThunk@12() + 0x12 bytes ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes 

它似乎试图locking一个关键部分是不存在或损坏,但我不知道如何/为什么它的作品第一次,而不是第二。

有任何想法吗?

谢谢,J

Solutions Collecting From Web of "在Windows上第二次使用libxml2崩溃"

这两个调用是在不同的线程?

你有没有调用xmlInitParser函数来初始化库。 缺少对xmlInitParser的调用将会在多线程应用程序中产生像您一样的调用堆栈。