c++ - libxml2 在 Windows 上第二次使用时崩溃

标签 c++ windows winapi libxml2

我一直在使用 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

最佳答案

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

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

关于c++ - libxml2 在 Windows 上第二次使用时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3127472/

相关文章:

c++ - C++ 中具有指向成员的指针的结构,如何访问它

c++ - 如何以编程方式检查 Windows Server 2016 上是否安装了桌面体验

c++ - 将文本文件复制到 USB 内存棒

c++ - 在 C++ 中向本地安装的 MSSQL DB 添加值

perl - 为什么 Perl 和 Word VBA 中的 Word 文档页数不同?

创建两个以上的 StatusBar 部件

c++ - 从一个类到任何类的成员函数的函数指针

node.js - 如果在 Git bash (mintty) 中使用 npm 脚本,则没有控制台颜色

c++ - WNDCLASS 和窗口句柄在单独的还是同一个类中?

c# - 如何复制具有深层路径的只读文件并保留文件时间元数据?