.net - 来自非托管代码的 System.AccessViolationException?

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

在我的 Invoke 实现中,每当我尝试对我传递的 IMFAsyncResult 对象执行任何操作(包括调用 QueryInterface 或其他操作)时,我都会收到 System.AccessViolationException。我实现 IMFAsyncCallback 的对象是分配在 CRT 堆上的基本 C++ 类(非托管),事件发布在 session 对象拥有的线程上,该线程也分配在 CRT 堆上。

  1. 什么可能导致此异常?

  2. 为什么我会从使用普通旧 C++ 实现的代码中抛出 .NET 托管异常?当你有一个混合模式程序集时,会发生这种情况吗?

最佳答案

Capture a crash dump ,然后加载到VS 2010或WinDbg中进行分析,全部显示出来。 VS 2010 会更容易,但 WinDbg 可能更有效。

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

  • 下载并安装 Debugging Tools for 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

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

https://stackoverflow.com/questions/3652380/

相关文章:

sql - Informix 7.3 - 声明日期列数据类型,默认为插入/更新时的当前日期

macos - 如何为 Mac OS X 制作可启动 DVD?

c# - 使用 Web 应用程序管理定时事件的首选方法是什么?

maven-2 - 为什么 Maven2 在每次构建时检查 stax-ex 的更新?

assembly - 是否有适用于 Windows 的免费小型汇编代码编译器/汇编器?

vim - 如何指定文件的缩进?

objective-c - 如何将 self 作为方法参数传递?

php - 永久登录

iphone - 如何确保浮点值始终是 0.25 的倍数?

iphone - CFBundleExecutable 错误