【问题标题】:Multi-threaded access in HEAP_NO_SERIALIZE heapHEAP_NO_SERIALIZE 堆中的多线程访问
【发布时间】:2012-06-08 14:07:10
【问题描述】:

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

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

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

【问题讨论】:

  • 不确定它是否有帮助,但Here 是我写给另一张海报的关于如何使用 WinDbg 的答案。
  • 您需要的信息在 VERIFIER STOP 消息中。您有两个线程同时访问非序列化堆,这是不允许的。这两个线程分别是 1444 和 3188。您需要更改程序,使两个线程不会尝试同时访问同一个堆。

标签: c++ windbg pageheap


【解决方案1】:

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

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

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

【讨论】:

  • 如何检查一个库是否是静态链接的。我正在使用 Visual Studio 2008
【解决方案2】:

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

.symfix;reload;

运行自动崩溃分析:

!analyze -v

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

~* kb;

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

您可以在项目设置下检查:配置属性 -> C/C++ -> 代码生成 -> 检查运行时图书馆。它应该说“多线程 DLL (/MD)”。

【讨论】:

    猜你喜欢
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多