仅在调试时执行ExengEngineException

时间:2013-01-16 12:02:13

标签: c# .net visual-studio-2012 entity-framework-5 executionengineexception

我有C#代码,只有在我调试它时才会抛出ExecutionEngineException。当我在没有调试的情况下从Visual Studio运行它时(按“启动而不调试”)按钮,这段代码工作正常。但是当我从Visual Studio调试它时,它会抛出ExecutionEngineException。

由于这个问题,我无法调试我的应用程序,因为我试图调试的代码是在有问题的代码之后执行的。

以下是一些细节:

  • 我使用的是Visual Studio 2012
  • 主应用程序是一个调用我的C#代码
  • 的C ++ / CLI应用程序
  • 应用程序运行一段时间,直到它到达C#
  • 中有问题的代码行
  • 相关代码是针对实体框架上下文的查询。
  • 我正在使用Entity Framework 5
  • 存储我的实体的数据库是SQL Server LocalDB(VS2012附带的那个)

修改

进一步的调查表明,实际问题是一个访问冲突异常,它起源于System.Data.DataSet的默认构造函数,如果我只写new DataSet(),也会发生这种情况。

编辑2 我创建了一个演示此问题的小应用程序。可以找到源代码here

欢迎您编译它并尝试运行项目Application。在创建新Adder.cs时,ExecutionEngineExceptionDataSet会崩溃。请注意,调试器应该是混合而不是托管/本机。

1 个答案:

答案 0 :(得分:4)

您的C ++ / CLI代码很可能破坏垃圾回收堆。非托管代码行为异常的一种非常典型的方法。直到稍后才会发现这种情况,就像新的对象或垃圾收集器运行时一样。所以崩溃的代码与导致损坏的代码完全无关,并且没有任何提示错误所在的位置。

调试这一点非常愉快,它通常需要进行彻底的代码审查,对非托管代码进行大量单元测试以及需要几天的调试才能找到它。 “仅在调试版本中崩溃”场景也很常见,并不意味着版本构建中没有堆损坏。你有点幸运,它失败了,在发布版本中发生堆损坏方式更难以调试。您将需要投资调试分配器以捕获操作中的错误,例如您从<crtdbg.h>获得的错误。这个问题一般使垃圾收集器成为管理内存的有利方式。

我对此表示哀悼和好运。