HEAP_NO_SERIALIZE堆中的多线程访问

时间:2012-06-08 14:07:11

标签: c++ windbg pageheap

我们的应用程序因以下错误而崩溃。

===========================================================
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方法在堆中分配内存。

我应该使用什么技术来识别崩溃?

2 个答案:

答案 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)'。