web-dev-qa-db-ja.com

保護されたメモリの読み取りまたは書き込みを試みました。多くの場合、これは他のメモリが破損していることを示しています

私は誰かがこのエラーを引き起こしている可能性について私に啓発できることを願っています:

保護されたメモリの読み取りまたは書き込みを試みました。多くの場合、これは他のメモリが破損していることを示しています。

このエラーはアプリケーションの任意の領域にスローされるように見えるため、実際にコードを投稿することはできません。アプリケーションは、エラーをスローする前に12〜48時間実行されます。一見ランダムに見える場所で停止して上記のエラーをスローする場合もあれば、アプリケーション全体が停止し、「致命的なエラーが発生しました... CLRのバグまたは...」PInvokeまたはその他の関連性のない情報についての何か。これが発生すると、すべてのスレッドが終了したことが示され、デバッグ情報は利用できません。

一言で言えば、これはアプリケーションが行うことです。

完全にC#で記述されたマルチスレッドサーバーアプリケーション。クライアントは、ソケットを介してサーバーに接続します。サーバーは、クライアントが相互におよび環境と対話できるクライアント用の仮想「環境」を実行します。それはかなりのメモリを消費しますが、リークが発生することはありません。通常、約1.5GBを消費します。アプリケーションの実行中はメモリ使用量が比較的一定のままであるため、そのリークはないと思います。クライアントが何もしていない場合でも、環境を維持するために常に実行されるコード。サードパーティのソフトウェアや他のAPIは使用しません。このアプリケーションが使用する外部リソースは、ソケット接続とSQLデータベース接続のみです。 64ビットサーバーで実行されます。 VS2008およびVS2010で.net 2.0、3.5、および4.0を使用し、複数のサーバーでこれをデバッグしようとしましたが、最終的には問題が発生します。

コンパイラーの最適化といくつかのMicrosoftホットフィックスをオフにしようとしました。この問題を解決するものは何もないようです。考えられる原因、または問題の原因を特定する何らかの方法を知っている人がいれば幸いです。

119
Someone Else

最後に、WinDBGとSOSを使用してこれを追跡しました。不明なDLLによってアクセス違反がスローされていました。 「Nvidia Network Manager」と呼ばれるソフトウェアが問題を引き起こしていたことが判明しました。私はこの問題がファイアウォールやウイルス対策によって引き起こされる方法を何度も読みましたが、どちらも使用していないので、この考えを却下しました。また、異なるハードウェアを使用する複数のサーバーで発生するため、環境ではないと想定していました。これをテストしたすべてのマシンが「NVidia Network Manager」を実行していたことが判明しました。残りのマザーボードドライバーと共にインストールされると思います。

この問題が私のアプリケーションを非常に長い間悩ませていたので、これが誰かの助けになることを願っています。

19
Someone Else

MapInfo DLLを使用したVS 2013 .NET 4.5でこの問題に直面しました。結局のところ、問題は、Platform for Buildをx86から​​Any CPUに変更したことであり、それがこのエラーを引き起こすのに十分だったということです。 x86に戻すとうまくいきました。誰かを助けるかもしれない。

43
Sergey

また、Visual Studio 2010でこの問題に直面しました。さらに興味深いことに、ソリューションにいくつかのプロジェクト(コンソールアプリケーション、WPFアプリケーション、Windowsフォームアプリケーション)がありましたが、「コンソールアプリケーション」タイプのプロジェクトを設定したときにのみ失敗しました「スタートアッププロジェクトとして(プロジェクトテンプレート自体に付属するデフォルトのアセンブリとは別に、文字通りコードや追加のアセンブリがまったくないものでも)。

次の変更は最終的に問題を特定するのに役立ちました:コンソールアプリケーションプロジェクトのプロジェクトプロパティに移動->右ペインのDebugタブに移動-> Enable Debuggersセクションに移動->以下のスナップショットに示すように、Enable unmanaged code debuggingチェックボックスをオンにします。なぜそれが起こったのかという根本的な原因は、私にはまだ分かりません。私が観察した唯一のことは、前日の夜に多くのWindowsの更新プログラムが私のマシンにインストールされていたことで、ほとんどがオフィスの更新プログラムとOSの更新プログラムで構成されていました(12を超えるKB記事)。

enter image description here

13
RBT

このコマンドを実行してみてください

netsh winsockのリセット

ソース: https://stackoverflow.com/a/20492181/1057791

11
BornToCode

この問題は、プロジェクト内の混合ビルドプラットフォームDLLが原因である可能性があります。つまり、プロジェクトを任意のCPUにビルドしますが、x86プラットフォーム用にすでにビルドされたプロジェクトにいくつかのDLLがあります。これらは、32ビットと64ビットアーキテクチャの異なるメモリマッピングが原因でランダムクラッシュを引き起こします。すべてのDLLが1つのプラットフォーム用にビルドされている場合、問題を解決できます。

このエラーはマネージコードでは発生しません。これは問題を解決するかもしれません:

Visual Studioデバッガーに移動して、この例外をバイパスします。

Tools menu ->Options -> Debugging -> General -> Uncheck this option "Suppress JIT optimization on module load"

それが役立つことを願っています。

7
curiousBoy

今日、私はこの例外に遭遇し、解決策を見つけました。抽象クラスの仮想メソッドを呼び出す単体テスト(NUnit)をデバッグしようとしたときに発生していました。

問題は、.NET 4.5.1のインストールにあるようです。

.NET 4.5.2をダウンロードしてインストールしました(私のプロジェクトはまだ.NET 4.5.1を参照しています)。問題は解決しました。

ソリューションのソース:

https://connect.Microsoft.com/VisualStudio/feedback/details/819552/visual-studio-debugger-throws-accessviolationexception

5
gb2d

最近、プロジェクトの開発サーバーを変更したときにこの問題が発生しました。新しいOracleConnection変数を宣言したコード行でこのエラーが発生していました。

修正プログラムのインストールなど、多くのことを試した後、プロジェクトの参照Oracle.DataAccessとSystem.Data.OracleClientを変更してみましたが、うまくいきました!

プロジェクトを新しいマシンに移動したら、そのプロジェクトに追加されたすべての参照を更新することをお勧めします。

5
deepakg_rao

検証可能なコードはメモリを破損することはできませんので、何か危険なことが起こっています。バッファ処理など、どこでも安全でないコードを使用していますか?また、PInvokeにはアンマネージコードへの移行と関連するマーシャリングが含まれるため、PInvokeに関することは無関係ではない可能性があります。

クラッシュしたインスタンスにアタッチし、 WinDBG and SOS を使用して、クラッシュ時に起きていることをより深く掘り下げることをお勧めします。これは気弱な人向けではありませんが、この時点で、より強力なツールを使用して、何が間違っているのかを正確に判断する必要があります。

3
Dan Bryant

アプリケーションの DEP(データ実行防止) をオフにしてみましたか?

3
alhazen

ハードウェアでもかまいません。複雑なこともありますが、スレッドコードがコレクション(辞書など)を適切なロックで保護していないことを示唆するのに一苦労します。

どのOSおよびサービスパックを実行していますか?

3
Mitch Wheat

わかりました、これはかなり役に立たず、単なる逸話かもしれませんが...

この例外は、プロジェクトで使用していた一部のTwain32ライブラリによって一貫してスローされましたが、私のマシンでのみ発生します。

私はインターネット上で多くの提案された解決策を試してみましたが、役に立ちませんでした...携帯電話を抜くまで(USB経由で接続されていました)。

そしてそれは働いた。

Twain32ライブラリが私の電話をTwain互換デバイスとしてリストしようとしていたことが判明し、そのプロセスで何かがその例外を引き起こしました。

図を行く...

3
almulo

私は同じ問題に直面しました。私のコードは、AutoCAD 2012内で実行されている.NET dll(AutoCAD拡張機能)でした。Oracle.DataAccessも使用しており、コードはExecuteNonQuery()中に同じ例外をスローしていました。幸いなことに、使用していたODPの.netバージョン(つまり、Oracle.DataAccessの2.x)を変更することで、この問題を解決しました。

3
kmxr

私の場合、ファイルは開いていたため、ロックされていました。

また、Excelで開かれたLinqToExcelを使用してExcelファイルをロードしようとしたときに取得していました。

これが私が行ったすべてです

    var maps = from f in book.Worksheet<NavMapping>()
                select f;
    try {
        foreach (var m in maps)
            if (!string.IsNullOrEmpty(m.SSS_ID) && _mappings.ContainsKey(m.SSS_ID))
                _mappings.Add(m.SSS_ID, m.CDS_ID);
    } catch (AccessViolationException ex) {
        _logger.Error("mapping file error. most likely this file is locked or open. " + ex);
    }
2
Sonic Soul

私もこの問題を抱えていました。 Visual Studioを使用して異なるソリューションを同時に実行していましたが、他のソリューションを閉じてターゲットソリューションだけを実行すると、そのエラーなしで正常に動作しました。

1
ako

この問題はほとんど常に単純な問題です。コードが悪いです。統計分析から得られるツールはめったにありません。毎日何百万人もの人々がVisual Studioを使用しており、おそらく数人があなたのコードを使用しています。これがVSの問題である場合、おそらく既に見つかっていることを保証します。

このステートメントの意味するところは、自分のものではないメモリにアクセスしようとすると、通常はどこか他の場所から来た破損したポインタでそれをしているためです。それが適応を述べている理由です。

メモリの破損により、エラーの捕捉がエラーの根本原因に近づくことはほとんどありません。そして、効果はまさにあなたが説明したもので、一見ランダムです。次のような通常の犯人を見るだけです。

  • 初期化されていないポインターまたはその他の値。
  • バッファにサイズよりも多く書き込む。
  • ミューテックスによって保護されていないスレッドによって共有されるリソース。

このような問題から逆方向に進んで根本原因を見つけることは、問題の作成と問題の検出の間に非常に多くのことが発生した可能性があるため、信じられないほど困難です。

私は主にis破損(たとえば、特定のポインター)を見てから、コードの手動静的分析を実行して、破損した可能性のあるものを確認し、通常の犯人をチェックする方が簡単だと思います上に示しました。ただし、これでも問題の長い連鎖をキャッチすることはできません。

VSに十分な知識はありませんが、メモリ追跡ツール(Linuxのvalgrindなど)を使用して、明らかな問題を発見できるかどうかを調べることもできます。

1
paxdiablo

VB.NETで作業していたプロジェクトでも同じエラーが発生しました。プロパティページで[アプリケーションフレームワークを有効にする]をチェックすると、解決しました。

1
Tony Raymond

前日に完璧にビルドしていたプロジェクトをビルドしようとしたときに、VS1017でこのエラーがランダムに発生しました。 PCを再起動すると問題は解決しました(必要なのかどうかはわかりませんが、事前に次のコマンドを実行しました:netsh winsock reset)

1
Eternal21

StringBuilderへの参照を取るメソッドでpinvokeを使用すると、このエラーが発生しました。明らかに16バイトしか割り当てないデフォルトのコンストラクタを使用していました。 Windowsは16バイト以上をバッファーに入れようとし、バッファーオーバーランを引き起こしました。

の代わりに

StringBuilder windowText = new StringBuilder(); // Likely overflow of default capacity of 16

より大きな容量を使用します。

StringBuilder windowText = new StringBuilder(3000);
1
Charlie

場合によっては、次の場合に発生する可能性があります。

obj = new obj();
...
obj.Dispose();  // <-----------------    Incorrect disposal causes it
obj.abc...
0
T.Todua

私の答えはあなたのシナリオに大きく依存しますが、Windows 8.1で動作するように、10年以上前のクライアントの.NETアプリケーションをアップグレードしようとして問題が発生しました。 @alhazenの答えは、私にとって正しい球場のようなものでした。アプリケーションは、クライアントが更新のために支払いたくないサードパーティDLLに依存していました(Pegasus/Accusoft ImagXpress)。 .NET 4.5のアプリケーションをリターゲットしましたが、次の行が実行されるたびにAccessViolationException was unhandledメッセージを受け取りました。

UnlockPICImagXpress.PS_Unlock (1908228217,373714400,1341834561,28447);

それを修正するには、次のビルド後イベントをプロジェクトに追加する必要がありました。

call "$(DevEnvDir)..\tools\vsvars32.bat"
"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\AMD64\editbin.exe" /NXCOMPAT:NO "$(TargetPath)"

これにより、実行可能ファイルがデータ実行防止と互換性がないことが明示的に指定されます。詳細については、 here を参照してください。

0
Barrie

私の場合、P/Invokeを使用してC/C++ライブラリを参照する必要がありましたが、最初にfixedを使用してメモリが出力配列に割り当てられていることを確認する必要がありました。

[DllImport("my_c_func_lib.dll", CharSet = CharSet.Ansi)]
public static extern unsafe int my_c_func(double input1, double input2, double pinput3, double *outData);

    public unsafe double[] GetMyUnmanagedCodeValue(double input1, double input2, double input3)
    {
        double[] outData = new double[24];

        fixed (double* returnValue = outData)
        {
            my_c_func(input1, input2, pinput3, returnValue);
        }

        return outData;
    }

詳細については、以下を参照してください: https://www.c-sharpcorner.com/article/pointers-in-C-Sharp/

0
user8128167