当调用EnterCriticalSection时,我在wxThread的启动函数中遇到访问冲突。这发生在客户站点,我从那里下载了.dmp文件以查看更多信息。在某种程度上,似乎CRITICAL_SECTION结构搞砸了,但是看到崩溃时的汇编代码和寄存器内容它仍然很奇怪,eax是0,而它是从它加载的内存单元,即[esi + 0x10]不包含0.这可能是.dmp文件的问题。
然而,主要的问题是,如果有人知道这可能发生的任何其他原因,而不是由于某些程序错误的随机内存写入。我已经发生了5次这次崩溃,没有其他虚假的崩溃。这与wxThread是浅层对象的事实相结合,使得应用程序代码似乎不太可能找到并销毁CRITICAL_SECTION结构的特定部分。
特别是知道是否有人经历过(并解决了!)类似的问题当然会很有趣。
环境是VS2008sp1和wxWidgets 2.8.11
这是线程的非常短的调用堆栈。可能这个线程正在死亡:
ntdll.dll!_RtlpWaitForCriticalSection@4() + 0x5b bytes
ntdll.dll!_RtlEnterCriticalSection@4() + 0x46 bytes
Shapesoft.exe!wxCriticalSection::Enter() + 0x7 bytes C++
Shapesoft.exe!wxThreadInternal::WinThreadStart() + 0x8e bytes C++
msvcr90.dll!_callthreadstartex()第348行+ 0x6字节C. msvcr90.dll!_threadstartex(void * ptd = 0x09c892a0)第326行+ 0x5字节C kernel32.dll!_BaseThreadStart@8()+ 0x37 bytes