2012-06-08 2 views
2

Наше приложение выходит из строя со следующей ошибкой.Многопоточный доступ в HEAP_NO_SERIALIZE heap

=========================================================== 
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 для выделения памяти в куче.

Какие методы следует использовать для идентификации аварии?

+0

Не уверен, что это поможет, но [Здесь] (http://stackoverflow.com/a/758840/241536) - это ответ, который я написал на другой плакат о том, как использовать WinDbg. –

+1

Необходимая информация содержится в сообщении ПРОВЕРКА ОСТАНОВКИ. У вас есть два потока, которые одновременно обрабатывают кучу без сериализации, что запрещено. Эти два потока - 1444 и 3188. Вам нужно изменить свою программу, чтобы два потока не пытались получить доступ к одной и той же куче одновременно. –

ответ

2

Вы, кажется, уже сделали это, запустив программу под WinDbg.

Быстрый поиск Google на интересных битах сообщения об ошибке нашел статью MSDN Multithreaded Access In A HEAP_NO_SERIALIZE Heap, что говорит мне, что некоторый модуль загружаемые связан с одноконстантным threadded CRT.

Я бы рассмотрел каждую часть вашего проекта и все настройки проекта, очень тщательно, чтобы убедиться, что все действительно с использованием библиотек MD. Что-то может быть статически связано.

+0

Как проверить, связана ли статическая связь библиотеки. Я использую Visual Studio 2008 – Maanu

+0

Проверьте настройки проекта. –

2

Закрепить с помощью WinDbg, исправить свои символы:

.symfix;reload; 

Выполнить автоматизированный анализ аварии:

!analyze -v 

Вы можете проверить стеки вызовов всех потоков:

~* kb; 

You может проверить, что зависит от ваших модулей, используя Dependency Walker и s ee, если таковые имеются, используют однопоточную ЭЛТ, но я также проверял бы, если какие-либо статически связаны как John Dibling suggests.

Вы можете проверить это в настройках проекта: Свойства конфигурации ->C/C++ ->Генерация кода ->Проверка библиотеки времени выполнения. Он должен сказать: «Многопоточная DLL (/ MD)».

Смежные вопросы