gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:35:21 25 4
gpt4 key购买 nike

我正在编写这个库,它通过媒体基础框架在 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 位版本):

.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

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

关于.net - 来自非托管代码的 System.AccessViolationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3652380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com