Я получаю ошибку кучи коррупции в библиотечном модуле C#, который я вызываю через COM в приложении C++. Специфическая ошибка:Как я могу отлаживать ошибки кучи в библиотеке классов C#?
КУЧА: Free 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)
{
[...]
}
Как я могу отлаживать это?
Update:
Когда я звоню, если из чистого приложения C# консоли (не COM или нативный код не участвует), я получаю:
Необработанное исключение типа 'System.AccessViolationException' произошел в [component] .dll
Дополнительная информация : Попытка прочитать или защищенная память. Это часто указание на то, что другая память повреждена.
Все еще не знаю, как я мог бы отладить это. Очевидно, что где-то происходит ошибка памяти, но как я могу ее отслеживать в чистом управляемом коде, где модель памяти даже не отображается?
Вы построили PIA для модуля COM, или вы использовали предварительно построенный PIA? – user7116 2008-10-10 02:00:42
Что такое PIA? Я создаю публичный интерфейс, если это то, о чем вы просите. Я успешно создал и использовал COM-объекты раньше, и это работает, если я немедленно вернусь; он работает только при использовании объектов VC .NET. Кроме того, см. Мои последующие действия. – Nick 2008-10-10 02:30:11