System.accessviolationException от неуправляемого кода?
-
01-10-2019 - |
Вопрос
Я пишу эту библиотеку, которая реализует некоторые основные функции аудиоплеера в C ++ / CLI через Media Foundation Framework, которые будут потребляться управляемым кодом. Я могу играть в аудио, остановить, паузу и т. Д. Просто в порядке. Для тех, кто не знаком с Media Foundation, средства Media Sessions посты, которые вы можете справиться с уведомлениями. Это делается путем вызовамонившегося на объекте сеанса с объектом imfasyncallback. IMFASYNCCALLBACK определяет сопоставление метода (IMFASYNCRESULT), который вы должны реализовать для обработки событий. Когда происходит событие, метод Invoke вызывается объектом сеанса на рабочей нити с объектом IMFASYNCRESULT, который вы можете запросить информацию о событии. Этот объект результата создается и принадлежит потоку события.
В моем внедрении ссылается, всякий раз, когда я пытаюсь сделать что-нибудь (это включает в себя просто позвонить в QueryInterface или что-то) с объектом imfasyncresult, который я прошел, я получаю систему. Объект, который у меня реализует IMFASYNCCALLBACK, является основным классом C ++ (не управляемого), выделенным на CRT Heap, и события размещены на потоке, принадлежащей объекту сеанса, также выделенного на кучу CRT.
Что может вызвать это исключение?
Почему я получаю .NET Управляемое исключение, брошенное из кода, который реализован в простых старых C ++? Это именно то, что происходит, когда у вас есть смешанный режим сборки?
Решение
Захватить свалку, Затем загрузите его в VS 2010 или WINGBG для анализа, и все будет выявлено. VS 2010 будет проще, но WINGBG может быть более эффективным.
Поскольку использование WINDBG является более сложный вариант, я разработаю это (выберите 32-битные или 64-битные версии следующего в соответствии с вашей целевой платформой):
- Загрузить и установить Инструменты отладки для Windows
Настройте символы отладки для Microsoft Symbol Server
.sympath srv*<SymbolCacheDir>*http://msdl.microsoft.com/download/symbols
Загрузите файл свалки в WINDBG (файл-> Открытый сбой ...)
Настройте символы отладки для ваших модулей
.sympath+ <PrivatePdbDir>
Нагрузка Сос Расширения в Windbg
.loadby sos mscorwks; * fw 2-3.5
или
.loadby sos clr; * fw 4
Скачать, извлечь и загрузить Sosex. Расширения в Windbg
.load <Sosex32or64Dir>\sosex
Пусть withbg делает анализ
!analyze -v
Используйте SOSEX, чтобы показать текущий стек потока (включая как управляемые, так и неуправляемые кадры)
!mk
Это, скорее всего, будет отвечать на ваши вопросы.
Другие советы
Похоже, у вас есть легкая репромата из этого - вы должны быть в состоянии отлавить проблему, прикрепление отладчика, когда программа запущена, и включает в себя нарушение доступа, чтобы попасть в ловушку в точке, при котором оно происходит. Часто библиотеки обертывают эту и поверхность ее как другой тип, а оригинальный сайт исключения не очевиден.
Чтобы прикрепить к вашему процессу от Visual Studio см. здесь. Отказ Когда вы присоедините к вашему мошенничеству, убедитесь, что вы выбираете параметры для отладки народного и управляемого кода. Убедитесь, что символы для ваших сборки и DLL доступны в Путь символа, насколько вы можете (некоторые могут быть недоступны, если они являются сторонним кодом).
Чтобы изменить конфигурацию исключений, так что нарушение доступа отберенена в источнике, см. здесь.