2

我的 C# 代码仅在调试时抛出 ExecutionEngineException。当我从 Visual Studio 运行它而不进行调试(按“不调试开始”)按钮时,这段代码可以正常工作。但是当我从 Visual Studio 调试它时,它会抛出 ExecutionEngineException。

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

以下是一些细节:

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

编辑

进一步调查表明,实际问题是源自 System.Data.DataSet 的默认构造函数的访问冲突异常,如果我只写new DataSet().

编辑 2 我创建了一个小应用程序来演示这个问题。源代码可以在这里找到。

欢迎您编译它并尝试运行该项目Application。创建新Adder.cs的. 请注意,调试器应该是混合的,而不是托管/原生的。ExecutionEngineExceptionDataSet

4

1 回答 1

4

您的 C++/CLI 代码很可能会破坏垃圾收集堆。非托管代码行为不端的一种非常典型的方式。这直到以后才会被发现,例如当您新建一个对象或垃圾收集器运行时。因此,崩溃的代码与导致损坏的代码完全无关,并且不会提示您错误的位置。

调试它并没有什么乐趣,它通常需要彻底的代码审查,对非托管代码进行大量单元测试以及几天的调试才能找到它。“仅在调试版本中崩溃”的情况也很常见,这并不意味着发布版本中没有堆损坏。你有点幸运,它像这样失败了,当它发生在发布版本中时,堆损坏更难调试。你会想要投资一个调试分配器来捕捉正在运行的错误,就像你从<crtdbg.h>. 这个问题通常使垃圾收集器成为管理内存的首选方式。

我的哀悼和祝你好运。

于 2013-01-16T14:33:49.293 回答