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

Я получаю ошибку повреждения кучи в модуле библиотеки C#, который я вызываю через COM в приложении C++. Конкретная ошибка:

HEAP: Free Heap block 4b61bb8 modified at 4b61be8 after it was freed
...
This may be due to a corruption of the heap, and indicates a bug in [app].exe or any of the DLLs it has loaded.

Верх стека вызовов:

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 или собственного кода), я получаю:

An unhandled exception of type 'System.AccessViolationException' occurred in [component].dll

Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

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

Вы создали PIA для модуля COM или использовали предварительно созданный PIA?

user7116 10.10.2008 06:00

Что такое PIA? Я создаю публичный интерфейс, если вы об этом спрашиваете. Раньше я успешно создавал и использовал COM-объекты, и этот работает, если я немедленно вернусь; он не работает только при использовании объектов VC .NET. Также см. Мое продолжение.

Nick 10.10.2008 06:30

PIA: msdn.microsoft.com/en-us/library/aax7sdch(VS.80).aspx

user7116 10.10.2008 06:32

Хороший момент по поводу ответа / редактирования, я соответствующим образом обновил исходный вопрос.

Nick 10.10.2008 08:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
1 971
1

Ответы 1

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

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

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

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

Nick 10.10.2008 08:43

Другие вопросы по теме