Я получаю сообщение об ошибке повреждения кучи в библиотечном модуле C#, который я вызываю через COM в приложении C++. Конкретная ошибка:
КУЧА: свободный блок кучи 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)
{
[...]
}
Как я могу отладить это?
Обновлять:
Когда я вызываю if из чистого консольного приложения C# (без участия COM или собственного кода), я получаю:
Произошло необработанное исключение типа «System.AccessViolationException» в [component].dll
Дополнительная информация: Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.
До сих пор не знаю, как я могу отладить это. Очевидно, где-то происходит ошибка памяти... но как я могу отследить ее в чистом управляемом коде, где модель памяти даже не раскрывается?