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

.net System.AccessViolationException是否来自非托管代码? 我正在编写这个C++库,它通过C++/CLI实现一些基本的音频播放器特性,这些框架将被托管代码所消耗的媒体基础框架。我可以播放音频、停止、暂停等。对于不熟悉媒体基础的任何人,媒体会话都会发布可以处理通知的事件。这是通过使用IMFAsyncCallback对象在会话对象上调用BeginGetEvent来完成的。IMFAsyncCallback定义了应该实现以处理事件的方法调用(IMFAsyncResult)。当事件发生时,工作线程上的会话对象将调用invoke方法,并使用可以查询事件信息的IMFAsyncResult对象。此结果对象由事件线程创建和拥有,.net,visual-c++,c++-cli,access-violation,ms-media-foundation,.net,Visual C++,C++ Cli,Access Violation,Ms Media Foundation,在我的Invoke实现中,每当我尝试使用传递的IMFAsyncResult对象执行任何操作(包括调用QueryInterface或其他操作)时,我都会得到一个System.AccessViolationException。我实现IMFAsyncCallback的对象是在CRT堆上分配的基本C++类(未托管),事件被发布在由CRT堆上分配的会话对象所拥有的线程上。 是什么导致了这种异常 为什么我得到一个从纯C++中实现的代码中抛出的.NET托管异常?这就是当你有一个混合模式组件时会发生的事情吗 ,

在我的Invoke实现中,每当我尝试使用传递的IMFAsyncResult对象执行任何操作(包括调用QueryInterface或其他操作)时,我都会得到一个System.AccessViolationException。我实现IMFAsyncCallback的对象是在CRT堆上分配的基本C++类(未托管),事件被发布在由CRT堆上分配的会话对象所拥有的线程上。
  • 是什么导致了这种异常

  • <>为什么我得到一个从纯C++中实现的代码中抛出的.NET托管异常?这就是当你有一个混合模式组件时会发生的事情吗

    ,然后将其加载到VS 2010或WinDbg中进行分析,并显示所有内容。VS2010将更容易,但WinDbg可能更有效

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

    • 下载并安装
    • 为调试配置调试符号
    .sympath srv**http://msdl.microsoft.com/download/symbols

    • 将崩溃转储文件加载到WinDbg(文件->打开崩溃转储…)
    • 为模块配置调试符号
    .sympath+

    • 将扩展加载到WinDbg中
    .loadby sos mscorwks;*fw 2-3.5

    .loadby sos clr;*fw 4

    • 将扩展下载、解压缩并加载到WinDbg中
    .load\sosex

    • 让WinDbg来做分析
    !分析-v

    • 使用SOSEX显示当前线程堆栈(包括托管和非托管框架)
    !mk

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

    ,然后将其加载到VS 2010或WinDbg中进行分析,所有内容都将显示出来。VS2010将更容易,但WinDbg可能更有效

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

    • 下载并安装
    • 为调试配置调试符号
    .sympath srv**http://msdl.microsoft.com/download/symbols

    • 将崩溃转储文件加载到WinDbg(文件->打开崩溃转储…)
    • 为模块配置调试符号
    .sympath+

    • 将扩展加载到WinDbg中
    .loadby sos mscorwks;*fw 2-3.5

    .loadby sos clr;*fw 4

    • 将扩展下载、解压缩并加载到WinDbg中
    .load\sosex

    • 让WinDbg来做分析
    !分析-v

    • 使用SOSEX显示当前线程堆栈(包括托管和非托管框架)
    !mk


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

    听起来您有一个简单的重做-您应该能够通过在程序运行时附加调试器来调试问题,并允许在发生访问冲突时捕获访问冲突。通常,库会将其包装并将其作为另一种类型显示,异常的原始位置并不明显

    要从Visual Studio附加到进程,请参见。连接到rogue进程时,请确保选择了调试本机代码和托管代码的选项。尽可能确保程序集和DLL的符号在中可用(如果它们是第三方代码,则某些符号可能不可用)


    要更改异常配置以使访问冲突可在源代码处调试,请参阅。

    听起来您可以轻松地重新进行此操作-您应该能够在程序运行时附加调试器并在发生访问冲突时捕获访问冲突,从而调试问题。通常,库会将其包装并将其作为另一种类型显示,异常的原始位置并不明显

    要从Visual Studio附加到进程,请参见。连接到rogue进程时,请确保选择了调试本机代码和托管代码的选项。尽可能确保程序集和DLL的符号在中可用(如果它们是第三方代码,则某些符号可能不可用)


    要更改异常配置,以便在源代码处调试访问冲突,请参阅。

    有关如何捕获崩溃转储的链接已失效。@GrixM已修复。。)关于如何捕获崩溃转储的链接已失效。@GrixM已修复。;)