1

我最近将一个应用程序从 .net 3.5 升级到了 4.0。自从我这样做后,启用了中断所有异常的调试设置,每次启动使用 EF 连接到数据库的应用程序的一部分时,我都会遇到一些这样的异常。确切的数字是可变的;有时我只得到一个,其他几个快速连续。

检测到 ReleaseHandleFailed 消息:“Microsoft.Win32.SafeHandles.SafeCapiHashHandle”类型的 SafeHandle 或 CriticalHandle 未能正确释放值为 0x06AD3D08 的句柄。这通常表明句柄通过其他方式被错误地释放(例如使用 DangerousGetHandle 提取句柄并直接关闭它或围绕它构建另一个 SafeHandle。)

瞄准 3.5 时,我从未遇到过这样的异常。这些异常没有附加任何有意义的调用堆栈,我得到的只是[External Code],拒绝任何简单的方法来本地化它们的来源。我怀疑 EntityFramework 以某种方式涉及的原因是应用程序的一部分使用 nHiberate 而不是生成任何这些消息。

运行可能涉及的其他依赖项:在所有情况下,ORM 都与 Sql Compact 数据库通信 MS Sync Framework 2.1 用于从 SqlServer 更新本地数据库。Entity 框架模型已经用 4.0 框架重新生成,我也将缓存数据库升级到 v4.0。

由于没有调用堆栈,我不确定这些消息是否属于框架内部自动清理的“无害”错误类别;或者如果有异常食者在应用程序的其他地方捕获它们。

4

1 回答 1

6

这不是一个例外,它是一个托管调试助手警告。当您将设置更改为“启用所有异常时中断”时,您可能有点过火了。Debug + Exceptions,Managed Debugging Assistants 节点,取消勾选“ReleaseHandleFailed”警告。默认情况下它是关闭的。

MDA 在 AesCryptoServiceProvider 类中捕获了一段时间未被发现的旧错误。背景资料在这里

从您的评论来看,您将犯下一个严重的错误。您不能通过避免加密或损害 dbase 连接安全性来解决此问题。您不小心打开了通常关闭的 MDA。MDA 通常会产生错误的警告,其中许多默认情况下是关闭的。该警告实际上是虚假的,释放句柄失败,因为它已经释放。这发生在终结器线程中,这就是你没有得到堆栈跟踪的原因。因此不能轻易找出首先使用该类的代码。

修复它的正确方法是正确使用 Debug + Exceptions 对话框。通过单击“全部重置”按钮修复您创建的问题。然后单击公共语言运行时异常的抛出复选框。这就是您要调试的内容。

于 2012-10-12T18:01:47.707 回答