Я получаю ошибку повреждения кучи в модуле библиотеки C #, который я вызываю через COM в приложении C ++. Конкретная ошибка:
HEAP: модифицированный блок свободной кучи 4b61bb8
на 4b61be8 после освобождения
...
Это может быть связано с
коррупция в куче и указывает
ошибка в [app] .exe
или любую из библиотек DLL, которые он загрузил.
Вершина стека вызовов:
CustomMarshalers.dll!System.Runtime.InteropServices.CustomMarshalers.EnumeratorViewOfEnumVariant.MoveNext() + 0x168 bytes
Теперь я понял, что .NET должен был уменьшить проблемы с памятью, а не сделать так, чтобы проблемы с памятью было невозможно исправить. Тем не менее, я не могу думать ни о чем, что я мог бы сделать, чтобы вызвать ошибку памяти, или как я мог бы попытаться исправить это. Конкретный модуль использует компоненты Microsoft.VisualStudio.VCProjectEngine .NET для итерации файлов проекта VC с довольно простыми итераторами. Он прерывается в операторе foreach при переборе файлов в фильтре (папке) VCProject, после того, как успешно завершил предыдущие около 100 вызовов. Фактический код, который нарушает:
IVCCollection CollectionFiles = (IVCCollection)FolderInProject.Files;
foreach (VCFile File in CollectionFiles)
{
[...]
}
Как можно отладить это?
Обновление:
Когда я звоню из чистого консольного приложения C # (без COM или собственного кода), я получаю:
Необработанное исключение типа
'System.AccessViolationException'
произошло в [component] .dll
дополнительный
информация: Попытка прочитать или
Запишите защищенную память. Это часто
признак того, что другая память
коррумпированы.
До сих пор не знаю, как я могу отладить это. Очевидно, что где-то произошла ошибка памяти ... но как я могу отследить ее в чистом управляемом коде, где модель памяти даже не раскрывается?