2

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

===========================================================
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的内部部分。在所有情况下,调用堆栈似乎都已损坏。

该应用程序使用库和 DLL 文件列表。所有 DLL 文件和库都是使用多线程 DLL 库(命令行选项/MD)构建的。

其中一个库使用HeapAlloc方法在堆中分配内存。

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

4

2 回答 2

2

通过在 WinDbg 下运行程序,您似乎已经完成了。

对错误消息中有趣的部分进行快速 Google 搜索,发现 MSDN 文章Multithreaded Access In A HEAP_NO_SERIALIZE Heap,这表明您正在加载的某些模块与单线程 CRT 相关联。

我会检查您项目的每个部分,以及所有项目设置,非常仔细地验证所有内容是否真的在使用 MD 库。某些东西可能是静态链接的。

于 2012-06-08T14:11:59.027 回答
2

使用WinDbg附加,修复您的符号:

.symfix;reload;

运行自动崩溃分析:

!analyze -v

您可以检查所有线程的调用堆栈:

~* kb;

您可以使用Dependency Walker检查您的模块的依赖关系,看看是否有任何使用单线程 CRT,但我也会检查是否有像John Dibling 建议的那样静态链接。

您可以在项目设置下进行检查:Configuration Properties -> C/C++ -> Code Generation -> Check Runtime Library。它应该说“多线程 DLL (/MD)”。

于 2012-06-08T14:13:00.013 回答