1

最近、アプリケーションを .net 3.5 から 4.0 にアップグレードしました。すべての例外で中断するデバッグ設定を有効にしてそれを行って以来、EF を使用してデータベースに接続するアプリケーションのセクションを開始するたびに、これらの例外のいくつかを取得しています。正確な数は可変です。1 つだけ取得することもあれば、立て続けに複数取得することもあります。

ReleaseHandleFailed が検出されました メッセージ: タイプ 'Microsoft.Win32.SafeHandles.SafeCapiHashHandle' の SafeHandle または CriticalHandle は、値 0x06AD3D08 のハンドルを適切に解放できませんでした。これは通常、ハンドルが別の手段 (DangerousGetHandle を使用してハンドルを抽出し、直接閉じるか、その周りに別の SafeHandle を構築するなど) によって誤って解放されたことを示します。

3.5 を対象とする場合、このような例外は発生しませんでした。これらの例外には意味のあるコール スタックが添付[External Code]されていません。EntityFramework が何らかの形で関与していると思われる理由は、アプリの 1 つのセクションが代わりに nHiberate を使用しており、これらのメッセージがまったく生成されないためです。

関連する可能性のある他の依存関係を突き止めるには: すべての場合において、ORM は Sql Compact データベースと通信します。MS Sync Framework 2.1 を使用して、SqlServer からローカル DB を更新します。4.0 フレームワークで Entity フレームワーク モデルが再生成され、キャッシュ DB も v4.0 にアップグレードされました。

コール スタックがないため、これらのメッセージがフレームワーク内部で自動的にクリーンアップされる「無害な」エラーのカテゴリに分類されるかどうかはわかりません。または、アプリケーションの他の場所でそれらをキャッチする例外イーターがある場合。

4

1 に答える 1

6

これは例外ではなく、ManagedDebuggingAssistantの警告です。設定を「有効になっているすべての例外で中断する」に変更したときに、少しやり過ぎた可能性があります。Debug + Exceptions、Managed Debugging Assistantsノードで、「ReleaseHandleFailed」警告のチェックを外します。デフォルトではオフになっています。

MDAは、AesCryptoServiceProviderクラスでしばらく検出されなくなった古いバグをキャッチします。背景説明はこちらです。

あなたのコメントから判断すると、あなたは劇的な間違いを犯そうとしています。暗号化を回避したり、dbase接続のセキュリティを危険にさらしたりして、これを解決することはできません。通常はオフになっているMDAを誤ってオンにしました。一般に、MDAは誤った警告を生成する傾向があり、それらの多くはデフォルトでオフになっています。警告は実際には偽物であり、ハンドルがすでに解放されているため、ハンドルの解放に失敗しました。これはファイナライザスレッドで発生するため、スタックトレースは取得されません。したがって、そもそもどのコードがクラスを使用しているかを簡単に見つけることはできません。

これを修正する適切な方法は、[デバッグ+例外]ダイアログを適切に使用することです。[すべてリセット]ボタンをクリックして、発生した問題を修正します。次に、共通言語ランタイム例外の[スロー]チェックボックスのみをクリックします。それがあなたがデバッグしようとしていることです。

于 2012-10-12T18:01:47.707 に答える