我们的应用程序因以下错误而崩溃。
===========================================================
VERIFIER STOP 00000003: pid 0x2E54: multithreaded access in HEAP_NO_SERIALIZE heap
00161000 : Heap handle
00001444 : Thread owning heap lock
00003188 : Current thread trying to acquire the heap lock
00000000 :
===========================================================
我们为应用程序启用了整页堆。应用程序在随机位置崩溃。碰撞位置通常是STL的内部部分。在所有情况下,callstack似乎都已损坏。
该应用程序使用库和DLL文件列表。所有DLL文件和库都使用多线程DLL库(命令行选项/MD
)构建。
其中一个库使用HeapAlloc方法在堆中分配内存。
我应该使用什么技术来识别崩溃?
答案 0 :(得分:2)
您似乎已经通过在WinDbg下运行程序来完成它。
快速Google搜索错误消息的有趣位,发现MSDN文章 Multithreaded Access In A HEAP_NO_SERIALIZE Heap ,这表明您加载的某些模块与单线程CRT相关联
我会仔细检查项目的每个部分以及所有项目设置,以验证使用MD库的所有内容都真正。某些东西可能是静态链接的。
答案 1 :(得分:2)
使用WinDbg附加,修复符号:
.symfix;reload;
运行自动崩溃分析:
!analyze -v
您可以检查所有线程的调用堆栈:
~* kb;
您可以使用Dependency Walker检查模块的依赖项,看看是否有任何使用单线程CRT,但我也会检查是否有任何静态链接,如John Dibling suggests。
您可以在项目设置下进行检查:配置属性 - > C / C ++ - > 代码生成 - > 检查运行时库。应该说'多线程DLL(/ MD)'。