System.AccessViolationException из неуправляемого кода? - PullRequest
1 голос
/ 06 сентября 2010

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

В моей реализации Invoke всякий раз, когда я пытаюсь и что-либо делать (в том числе просто вызываю QueryInterface или что-то еще) с объектом IMFAsyncResult, который я передаю, я получаюSystem.AccessViolationException.Реализуемый мной объект IMFAsyncCallback - это базовый класс C ++ (не управляемый), размещенный в куче CRT, а события публикуются в потоке, принадлежащем объекту сеанса, также размещенному в куче CRT.

  1. Что может быть причиной этого исключения?

  2. Почему я получаю исключение, управляемое в .NET, из кода, который реализован на старом простом C ++?Это именно то, что происходит, когда у вас сборка смешанного режима?

Ответы [ 2 ]

8 голосов
/ 07 сентября 2010

Захватите аварийный дамп , затем загрузите его в VS 2010 или WinDbg для анализа, и все должно быть обнаружено. VS 2010 будет проще, но WinDbg может быть более эффективным.

Поскольку использование WinDbg является более сложным вариантом, я подробно остановлюсь на этом (выберите 32-разрядную или 64-разрядную версию следующего в зависимости от вашей целевой платформы):

  • Скачать и установить Средства отладки для Windows
  • Настройка символов отладки для Microsoft Symbol Server

    .sympath srv*<SymbolCacheDir>*http://msdl.microsoft.com/download/symbols

  • Загрузить файл аварийного дампа в WinDbg (Файл-> Открыть аварийный дамп ...)

  • Настройка символов отладки для ваших модулей

    .sympath+ <PrivatePdbDir>

  • Загрузка SOS расширений в WinDbg

    .loadby sos mscorwks; * fw 2-3.5

    или

    .loadby sos clr; * fw 4

  • Загрузка, распаковка и загрузка SOSEX расширений в WinDbg

    .load <Sosex32or64Dir>\sosex

  • Пусть WinDbg сделает анализ

    !analyze -v

  • Используйте SOSEX для отображения текущего стека потока (включая как управляемые, так и неуправляемые кадры)

    !mk

Это, скорее всего, ответит на ваши вопросы.

1 голос
/ 25 сентября 2010

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

Чтобы присоединиться к вашему процессу из Visual Studio, см. здесь .Когда вы присоединяетесь к своему мошенническому процессу, убедитесь, что вы выбрали параметры для отладки собственного и управляемого кода.Убедитесь, что символы для ваших сборок и библиотек DLL доступны в Путь символа , насколько это возможно (некоторые могут быть недоступны, если они являются сторонним кодом).

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

...