Как я могу отлаживать ошибки кучи в библиотеке классов C#?

Я получаю сообщение об ошибке повреждения кучи в библиотечном модуле 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

Дополнительная информация: Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

До сих пор не знаю, как я могу отладить это. Очевидно, где-то происходит ошибка памяти... но как я могу отследить ее в чистом управляемом коде, где модель памяти даже не раскрывается?


person Nick    schedule 10.10.2008    source источник
comment
Вы построили PIA для COM-модуля или использовали предварительно созданный PIA?   -  person user7116    schedule 10.10.2008
comment
Что такое ПИА? Я создаю публичный интерфейс, если вы об этом. Раньше я успешно создавал и использовал COM-объекты, и этот работает, если я возвращаюсь немедленно; он терпит неудачу только при использовании объектов VC .NET. Также смотрите мое продолжение.   -  person Nick    schedule 10.10.2008
comment
PIA: msdn.microsoft.com/en-us/library /aax7sdch(VS.80).aspx   -  person user7116    schedule 10.10.2008
comment
Хороший вопрос об ответе / редактировании, я соответственно обновил исходный вопрос.   -  person Nick    schedule 10.10.2008


Ответы (1)


Похоже, что ваш COM-интерфейс неправильно маршалирует переменную параметра/возврата, в результате чего либо управляемая память неожиданно освобождается сборщиком мусора, либо неуправляемая память уничтожается из-за неправильного маршалинга. Вы можете получить более тонкий контроль над интерфейсом COM, созданным путем создания собственного Первичная сборка взаимодействия для COM-компонента. Приложив немного усилий, вы сможете изучить вызывающий нарушение метод в COM-объекте и убедиться, что все его параметры имеют правильные метаданные, чтобы обеспечить их правильное маршалирование.

Другая возможность заключается в том, что вы маршалируете все правильно, но не совсем правильно вызываете интерфейс, проявляя себя как неправильное использование параметра, который в конечном итоге приводит к сбою неуправляемой памяти. Их менее интересно отслеживать, особенно если у вас нет доступа к источнику COM.

Один из приемов заключается в том, чтобы позволить программе аварийно завершать работу за пределами вашего отладчика, щелкнув «Отладка», чтобы открыть окно выбора JIT-отладчика. Затем установите флажок «Выбрать механизм отладки» (или что-то в этом роде) и убедитесь, что установлены флажки «Управляемый» и «Собственный». Появляющийся экземпляр VS должен быть сломан в фактическом коде, который умер, а не в самом близком к смерти управляемом коде.

person user7116    schedule 10.10.2008
comment
Однако я не думаю, что это часть COM; в моем тестовом консольном приложении нет использования COM. Я подозреваю, что это как-то связано с классами автоматизации Visual Studio, но я понятия не имею, как его отлаживать. - person Nick; 10.10.2008