我有C#代码,只有在我调试它时才会抛出ExecutionEngineException。当我在没有调试的情况下从Visual Studio运行它时(按“启动而不调试”)按钮,这段代码工作正常。但是当我从Visual Studio调试它时,它会抛出ExecutionEngineException。
由于这个问题,我无法调试我的应用程序,因为我试图调试的代码是在有问题的代码之后执行的。
以下是一些细节:
修改
进一步的调查表明,实际问题是一个访问冲突异常,它起源于System.Data.DataSet的默认构造函数,如果我只写new DataSet()
,也会发生这种情况。
编辑2 我创建了一个演示此问题的小应用程序。可以找到源代码here。
欢迎您编译它并尝试运行项目Application
。在创建新Adder.cs
时,ExecutionEngineException
与DataSet
会崩溃。请注意,调试器应该是混合而不是托管/本机。
答案 0 :(得分:4)
您的C ++ / CLI代码很可能破坏垃圾回收堆。非托管代码行为异常的一种非常典型的方法。直到稍后才会发现这种情况,就像新的对象或垃圾收集器运行时一样。所以崩溃的代码与导致损坏的代码完全无关,并且没有任何提示错误所在的位置。
调试这一点非常愉快,它通常需要进行彻底的代码审查,对非托管代码进行大量单元测试以及需要几天的调试才能找到它。 “仅在调试版本中崩溃”场景也很常见,并不意味着版本构建中没有堆损坏。你有点幸运,它失败了,在发布版本中发生堆损坏方式更难以调试。您将需要投资调试分配器以捕获操作中的错误,例如您从<crtdbg.h>
获得的错误。这个问题一般使垃圾收集器成为管理内存的有利方式。
我对此表示哀悼和好运。