Многопоточный доступ в куче HEAP_NO_SERIALIZE
Наше приложение вылетает со следующей ошибкой.
===========================================================
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 для выделения памяти в куче.
какие методы я должен использовать, чтобы идентифицировать аварию?
2 ответа
Вы, кажется, уже сделали это, запустив свою программу под WinDbg.
Быстрый поиск в Google по интересным битам сообщения об ошибке обнаружил статью MSDN Многопоточный доступ в куче HEAP_NO_SERIALIZE, которая подсказывает мне, что какой-то загружаемый вами модуль связан с однопоточным CRT.
Я бы очень внимательно изучил каждую часть вашего проекта и все настройки проекта, чтобы убедиться, что все действительно использует библиотеки MD. Что-то может быть статически связано.
Присоедините с помощью WinDbg, исправьте ваши символы:
.symfix;reload;
Запустить автоматический анализ сбоев:
!analyze -v
Вы можете проверить стеки вызовов всех потоков:
~* kb;
Вы можете проверить, каковы зависимости для ваших модулей, с помощью Dependency Walker и посмотреть, используют ли какие-либо однопоточные CRT, но я бы также проверил, статически ли связаны какие-либо из них, как предлагает Джон Диблинг.
Вы можете проверить это в настройках проекта: Свойства конфигурации -> C / C++ -> Генерация кода -> Проверка библиотеки времени выполнения. Должно быть написано "Многопоточная DLL (/MD)".