Вопрос

Я пишу эту библиотеку, которая реализует некоторые основные функции аудиоплеера в C ++ / CLI через Media Foundation Framework, которые будут потребляться управляемым кодом. Я могу играть в аудио, остановить, паузу и т. Д. Просто в порядке. Для тех, кто не знаком с Media Foundation, средства Media Sessions посты, которые вы можете справиться с уведомлениями. Это делается путем вызовамонившегося на объекте сеанса с объектом imfasyncallback. IMFASYNCCALLBACK определяет сопоставление метода (IMFASYNCRESULT), который вы должны реализовать для обработки событий. Когда происходит событие, метод Invoke вызывается объектом сеанса на рабочей нити с объектом IMFASYNCRESULT, который вы можете запросить информацию о событии. Этот объект результата создается и принадлежит потоку события.

В моем внедрении ссылается, всякий раз, когда я пытаюсь сделать что-нибудь (это включает в себя просто позвонить в QueryInterface или что-то) с объектом imfasyncresult, который я прошел, я получаю систему. Объект, который у меня реализует IMFASYNCCALLBACK, является основным классом C ++ (не управляемого), выделенным на CRT Heap, и события размещены на потоке, принадлежащей объекту сеанса, также выделенного на кучу CRT.

  1. Что может вызвать это исключение?

  2. Почему я получаю .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 доступны в Путь символа, насколько вы можете (некоторые могут быть недоступны, если они являются сторонним кодом).

Чтобы изменить конфигурацию исключений, так что нарушение доступа отберенена в источнике, см. здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top