Frage

Ich schreibe diese Bibliothek, dass Geräte einige grundlegende Audio-Player-Funktionen in C ++ / CLI über die Media Foundation-Framework, das den verwalteten Code verbraucht wird. Ich kann Audio-Wiedergabe, Stopp, Pause usw. gut. Für alle, die nicht vertraut sind mit Media Foundation, die Mediensitzung die Ereignisse auf, dass Sie sich für Benachrichtigungen behandeln kann, ist. Dies wird durch den Aufruf BeginGetEvent auf dem Session-Objekt mit einem IMFAsyncCallback Objekt gemacht. Der IMFAsyncCallback definiert die Methode Invoke (IMFAsyncResult), dass Sie die Ereignisse behandeln implementieren sollten. Wenn ein Ereignis auftritt, wird die Methode invoke durch das Sitzungsobjekt auf einem Arbeits-Thread mit einem IMFAsyncResult Objekt aufgerufen, dass Sie für die Veranstaltung Informationen abfragen. Dieses Ergebnis Aufgabe wird durch das Ereignis Thread erstellt und im Besitz.

In meiner Implementierung von Invoke, wenn ich versuche, und alles tun, mit dem IMFAsyncResult Objekt (die nur Query-Interface oder etwas beinhaltet Aufruf), dass ich bestanden habe, erhalte ich eine System.AccessViolationException. Das Objekt, das ich IMFAsyncCallback umsetzen, ist eine grundlegende C ++ Klasse (nicht verwaltet) auf dem CRT-Heap zugewiesen und die Ereignisse an einem Faden durch das Sitzungsobjekt auch auf dem CRT-Heap zugewiesen Besitz geschrieben.

  1. Was verursacht diese Ausnahme könnte?

  2. Warum ich eine .NET verwaltete Ausnahme von Code ausgelöst bekommen, die in plain old C implementiert ++? Ist das genau das, was passiert, wenn Sie Montage eines gemischten Modus haben?

War es hilfreich?

Lösung

einen Absturz erfassen Dump , laden sie es dann in VS 2010 oder WinDbg für die Analyse und alles soll offenbart werden. VS 2010 wird einfacher, aber WinDbg könnte effektiver sein.

Da WinDbg mit der komplizierteren Option ist ich das näher ausführen werde (wählen Sie die 32-Bit- oder 64-Bit-Versionen des folgenden nach der Zielplattform):

  • Herunterladen und Installieren von Debugging Tools für Windows
  • Configure Debug-Symbole für die Microsoft Symbol Server

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

  • Laden Sie die Crash-Dump-Datei in WinDbg (File-> Open Crash-Dump ...)

  • Configure Debug-Symbole für Ihre Module

    .sympath+ <PrivatePdbDir>

  • Laden Sie SOS Erweiterungen in WinDbg

    .loadby sos mscorwks; * fw 2-3.5

    oder

    .loadby sos clr; * fw 4

  • Download, extrahieren und Last SOSEX Erweiterungen in WinDbg

    .load <Sosex32or64Dir>\sosex

  • Lassen Sie WinDbg tun, um die Analyse

    !analyze -v

  • Verwenden SOSEX den aktuellen Thread-Stack zeigen (einschließlich der beiden verwalteten und nicht verwalteten Frames)

    !mk

Dies wird höchstwahrscheinlich Ihre Fragen beantworten.

Andere Tipps

Sounds wie Sie eine einfache Repro dieses haben - Sie sollten das Problem debuggen, indem er die Debugger Befestigung, während das Programm ausgeführt wird, und ermöglicht Zugriffsverletzung an dem Punkt, gefangen zu sein, an dem sie auftritt. Oft diese Bibliotheken wickeln und sie als eine andere Art der Oberfläche, und die ursprüngliche Stelle der Ausnahme, ist nicht ersichtlich.

Um zu Ihrem Prozess von Visual Studio anhängen finden Sie unter hier . Wenn Sie zu Ihrem Schelm Prozess anhängen, stellen Sie sicher, dass die Optionen wählen Code zu debuggen nativen und verwaltet werden. Achten Sie darauf, Symbole für Ihre Baugruppen und DLLs sind in der Symbolpfad , so weit wie möglich (einige nicht verfügbar sein können, wenn sie Code von Drittanbietern sind).

zu ändern Exception Config, so dass die Zugriffsverletzung ist debug an der Quelle finden Sie unter hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top