8

.NET でのアクセス違反エラーの一般的な原因を探しています。

これまでに確認したこと -

  • IDisposable を実装するすべてのオブジェクトで Dispose を呼び出す
  • COM オブジェクトへの呼び出しで有効な引数を確認する
  • 手動で追加されたすべてのイベント ハンドラーを明示的に削除する
  • 明示的に GC.Collect/GC.WaitForPendingFinalizers を呼び出さないでください
  • ネイティブ オブジェクト (ビットマップなど) を処理する際のメモリ プレッシャーの追加と削除(追加)
  • 有効な引数の型に対するすべての PInvoke 呼び出しを確認する
  • IntPtr、SafeHandle、HandleRef の適切な使用を確認する
  • スレッディング (スレッド セーフ、再入可能関数)、待機ハンドルの適切な使用。(追加)
  • アプリケーションと DLL がすべて同じプラットフォーム (x86 または x64) をターゲットにしていることを確認します (アプリケーションと DLL は、COM オブジェクトと同じプラットフォームをターゲットにする必要があります) (追加) 。

他の提案はありますか?

編集- クラッシュ ダンプ分析を別の質問に移動しました。

4

2 に答える 2

3

アンセーフ コードまたはアンマネージ コードを使用すると、そのタイプの例外が発生する可能性があります。

AccessViolationException:

アクセス違反は、アンマネージ コードまたはアンセーフ コードで、割り当てられていないメモリまたはアクセス権のないメモリに対して読み取りまたは書き込みを行おうとすると発生します。これは通常、ポインターの値が正しくないために発生します。不正なポインターを介したすべての読み取りまたは書き込みがアクセス違反につながるわけではないため、アクセス違反は通常、不正なポインターを介して複数の読み取りまたは書き込みが発生し、メモリが破損している可能性があることを示します。したがって、アクセス違反はほとんどの場合、重大なプログラミング エラーを示しています。.NET Framework バージョン 2.0 では、AccessViolationException によってこれらの重大なエラーが明確に識別されます。

検証可能なマネージ コードのみで構成されるプログラムでは、すべての参照が有効または null であり、アクセス違反はあり得ません。AccessViolationException は、検証可能なマネージド コードがアンマネージド コードまたは安全でないマネージド コードと対話する場合にのみ発生します。

おすすめされた:

GFlagsアプリケーション検証ツール

于 2009-02-08T23:48:56.683 に答える
1

実行時に IL を生成していますか、それともそうするコンポーネントを使用していますか? 安全でない C# コードを使用してポインター操作を行っていますか?

于 2009-02-08T23:30:17.510 に答える