【问题标题】:libxml2 crash on second use on Windowslibxml2 在 Windows 上第二次使用时崩溃
【发布时间】:2010-06-27 13:28:11
【问题描述】:

我一直在使用 libxml2 推送解析 (SAX) 来解析传入的 XML 流,这第一次运行良好,但每次第二次尝试时都会崩溃,我的代码如下所示:

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) 来释放上下文。正如我所提到的,这一切都在第一组数据上完美运行,但是当再次运行代码时我遇到访问冲突,堆栈跟踪是:

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

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

有什么想法吗?

谢谢, J

【问题讨论】:

  • 使用可用的源代码创建调试版本。
  • 帖子已编辑以包含来自调试版本的真实堆栈跟踪
  • 也许解析器处理程序中的代码对违规负责。如果被注释掉怎么办?
  • 您好 JWood,您找到解决方案了吗?恐怕我们面临同样的问题
  • 没关系,stackoverflow.com/questions/10737606/…(实现内存生命周期例程)为我们修复它

标签: c++ windows winapi libxml2


【解决方案1】:

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

您是否调用了xmlInitParser 函数来初始化库。缺少对 xmlInitParser 的调用将在多线程应用程序中产生与您类似的调用堆栈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2011-05-27
    相关资源
    最近更新 更多