我正在编写此库,该库通过媒体基础框架在C ++/CLI中实现了一些基本的音频播放器功能,这些框将被托管代码消费。我可以播放音频,停止,暂停等。对于任何不熟悉媒体基金会的人,媒体会议发布了您可以进行通知的事件。这是通过使用iMfasynccallback对象在会话对象上调用begingetevent来完成的。 Imfasynccallback定义了您应该实现的方法来处理事件的方法(iMfasyncresult)。发生事件时,将在带有iMfasyncresult对象的工作线程上的会话对象调用调用方法,您可以查询事件信息。此结果对象由事件线程创建和拥有。

在我实施Invoke时,每当我尝试使用我被传递的iMfasyncresult对象进行任何操作(包括调用QueryInterface之类的东西)时,我都会获得System.AccessVioLationException。我实现的对象IMFASYNCCALLBACK是在CRT堆上分配的基本C ++类(未管理),事件发布在CRT Heap上的会话对象拥有的线程上。

  1. 什么可能导致这个例外?

  2. 为什么我会从普通旧C ++实现的代码中获得.NET托管的异常?那是当您具有混合模式组件时会发生什么?

有帮助吗?

解决方案

捕获崩溃转储, ,然后将其加载到VS 2010或WINDBG中进行分析,并应显示所有内容。 VS 2010将更容易,但是WINDBG可能更有效。

由于使用WINDBG是更复杂的选择,我将详细说明(根据您的目标平台选择以下32位或64位版本):

  • 下载并安装 Windows的调试工具
  • 配置调试符号 Microsoft符号服务器

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

  • 将崩溃转储文件加载到windbg(file->打开崩溃转储...)

  • 为模块配置调试符号

    .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

这很可能会回答您的问题。

其他提示

听起来您可以轻松地对此进行重复 - 您应该能够通过在程序运行时附加调试器来调试问题,并使访问违规行为被困在发生时。通常,库将其包裹并表面为另一种类型,并且异常的原始位点并不明显。

要从Visual Studio附加到您的过程 这里. 。连接到Rogue流程时,请确保选择调试本机和托管代码的选项。确保您的组件和DLL的符号可在 符号路径,尽可能(如果是第三方代码,则可能没有一些)。

要更改异常配置,以使访问违规行为是可以在源头上辩论的,请参见 这里.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top