0

我的 C# WPF 应用程序定期运行,并且时不时地我不断收到此错误,尝试读取或写入受保护的内存,这通常表明其他内存已损坏 c#

这是我的代码。最初我认为一些外部应用程序正在干扰我的数据库,所以我添加了一个代码来检查数据库是关闭还是打开。但错误似乎是别的东西,这让我发疯。

我正在发布调用堆栈,我看到线程 17 有一些关于问题是如何引起的事实。

我共享整个转储文件的驱动器的链接请查看第 17 号线程 [ https://drive.google.com/open?id=0BzWisplLq-PqMlhzaVdFNTJiZjg ]

请帮我找到问题?我是新来的。在此处输入图像描述

using (var context = Context.Create("C:\\XSR_BIB_V2\\XSR_BIB_V2_DATABASE.sdf", "", 4091))
 {
  if (DbUpdateLoop.context.Database.Connection.State == System.Data.ConnectionState.Closed)  
                                              DbUpdateLoop.context.Database.Connection.Open();

           try
              {
             var data = DbUpdateLoop.context.EnergyPeakInfo_Tbl.Where(x => (my_startTime >= x.StartTime) && (my_stopTime <= x.StopTime)).FirstOrDefault();
               }
           catch (AccessViolationException aV)
            {
            //exception is not caught here
            }
            }
4

1 回答 1

2

AccessViolationException几乎总是表明非托管代码试图在进程中读取或写入未映射的内存。托管代码抛出此异常的唯一方法是故意调用throw new AccessViolationException(),而托管代码绝不应该这样做。在您的特定情况下,异常是由某些数据库库触发的,显然是在非托管上下文中。发生这种情况时,您将无法捕获异常。这是MSDN中的一个部分,解释了这一点:

AccessViolationException 和 try/catch 块

从 .NET Framework 4 开始,AccessViolationException如果异常发生在公共语言运行时保留的内存之外,则公共语言运行时引发的异常不会由结构化异常处理程序中的 catch 语句处理。要处理此类 AccessViolationException异常,您应该将该 HandleProcessCorruptedStateExceptionsAttribute属性应用于引发异常的方法。此更改不会影响 AccessViolationException用户代码引发的异常,这些异常可以继续被 catch 语句捕获。对于为以前版本的 .NET Framework 编写的代码,您希望在 .NET Framework 4 上重新编译和运行而无需修改,您可以添加 <legacyCorruptedStateExceptionsPolicy>元素添加到应用的配置文件中。AppDomain.FirstChanceException请注意,如果您为orAppDomain.UnhandledException事件定义了处理程序,您也可以收到异常通知 。

基本上,这意味着尝试捕获 AV 的代码将不起作用:

try
{
    ... code that throws AV exception
}
catch (AccessViolationException ex)
{
    ... this will never be executed, exception will propagate to top level process handler
}

我不建议捕获 AV 异常或应用于HandleProcessCorruptedStateExceptionsAttribute您的程序集,除非您知道如何从异常中恢复,在您的情况下您不知道,因为您不知道是什么确切的操作触发了这个。

现在,回答您最初的问题:如何分析此异常的调用堆栈。由于异常是非托管的,因此需要在VS中开启非托管调试,并在触发该异常时收集非托管调用堆栈。

于 2017-01-02T20:11:54.320 回答