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


144

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

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

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

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

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

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


完全なコールスタックを投稿してください...
Mitch Wheat


約半分の時間でコールスタックを取得できません。致命的な実行エラーがスローされた場合、デバッグ情報はまったくありません。それが実際にコードのどこかで停止する時間は、何も異常に見えません。私はすべてのアクティブなスレッドを調べ、競合を引き起こす可能性のあるものを見たことはありません。エラーが発生する前に、メモリ破損が発生したと想定しています。
その他

使用されているくだらない古いCOMおよびActiveXコンポーネントを確認します。また、SQLCEがマルチスレッド環境でこのように失敗することも知っています。
leppie 2010年

COMまたはActiveXコンポーネントはありません。
その他

回答:


50

MapInfo DLLを使用してVS 2013 .NET 4.5でこの問題に直面しました。結局のところ、問題は私がビルド用のプラットフォームをx86から​​Any CPUに変更したことであり、それがこのエラーをトリガーするのに十分でした。x86に戻すとうまくいきました。誰かを助けるかもしれません。


1
どのようにx86に戻しましたか。私はこの命令で同じ問題をただ魅了しているだけですCSingleLock lock(&m_csMember, TRUE);詳細については、こちらの投稿をご覧ください
ABCmo

VS 2012/2013で、[プロジェクトプロパティ]-> [ビルド]に移動し、「プラットフォームターゲット」を必要なものに変更します。これを変えられるところは他にもあると思いますが、見当たらないようですが、どちらの方法も同じ結果が得られると思います。
セルゲイ

私は実際にVS 2013を使用しており、x86として構成されています:/
ABCmo

1
あなたの問題は多くの原因で発生する可能性があります。ビルドプラットフォームを変更して問題を修正したことに本当に驚いています。あなたは幸運な脱出と言えるでしょう。
セルゲイ

このソリューションとこの回答を組み合わせることで解決しました。
Zach Posten

23

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

次の変更により、最終的に問題を特定するのに役立ちました:コンソールアプリケーションプロジェクトのプロジェクトプロパティに移動します(または、ソリューションエクスプローラーでプロジェクトファイルを選択し、Alt+ Enterキーの組み合わせを押します)-> Debugタブに移動-> Enable Debuggers右ペインのセクションにスクロール->チェックEnable unmanaged code debuggingチェックボックスの下のスナップショットのように- >をクリックしFloppy、プロジェクトのプロパティを保存するには、ツールバーのボタンを。それが起こった根本的な原因はまだ私にはわかりません。私が観察した唯一のことは、前の晩に私のマシンにインストールされた多くのWindowsアップデートがあり、そのほとんどがオフィスのアップデートとOSのアップデートで構成されていることでした(12以上のKB記事)。

ここに画像の説明を入力してください

更新:VS 2017以降、次のスクリーンショットに示すように設定名が変更されました。

ここに画像の説明を入力してください


1
VS 2017のように、これは「に改名されたネイティブコードのデバッグを有効にする
Chiramisu

1
最新情報を提供し、コミュニティを支援してくれた@Chiramisuに感謝します。新しいバージョンのVisual Studioに適するように、回答を更新しました。
RBT

19

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

この問題が非常に長い間私のアプリケーションを悩ませていたので、うまくいけばこれは誰かを助けるでしょう。


1
私の場合、デバイスからデータを頻繁に読み取ると、そのスローエラーが発生し、次の読み取りのためにThread.Sleep(1000)を使用してしばらくスレッドを停止しました。そして完璧に働いています。
JRB 2014年

6
治療法は「NVidia Network Managerのアンインストール」であると私は思っていたでしょう
ポール14

79
論理的な答えを提供しない、最も投票された回答。
Teoman Shipahi

マザーボードやソフトウェアにnvidiaに関連するものはないと思います。Visual Studio 2010を使用しています。この問題は、VSからプロジェクトをデバッグしているときにのみ発生します。デバッグフォルダーからの出力exeは完璧に動作します。
RBT

1
問題の原因となっている自分のプロセスのスレッドにアクセスしています。
ムハンマド

13

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



8

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

この例外を回避するには、Visual Studio Debuggerに移動します。

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

お役に立てば幸いです。


3
うまくいきませんでした。このエラーは多くの理由で発生します。私が投稿した解決策は、理由がJIT最適化である場合、他の誰かの問題を解決する可能性があると思いました。
curiousBoy

6

今日、私は遭遇し、この例外に対する解決策を見つけました。抽象クラスの仮想メソッドを呼び出す単体テスト(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

ハードウェアである可能性があります。少し複雑になる可能性があります...しかし、スレッディングコードが適切なロックでコレクション(ディクショナリなど)を保護していないことを示唆しています。

実行しているOSとサービスパックは何ですか?


1
XP 64 SP2を実行している。ただし、これは複数のサーバーで発生しています。私はすべてを何度も試してみましたが、スレッドセーフではないものはありません。また、アクセス違反ではなくコレクション変更エラーが発生することはありませんか?
誰か

5

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

ホットフィックスのインストールを含む多くのことを試した後、プロジェクトの参照Oracle.DataAccessおよびSystem.Data.OracleClientを変更してみましたが、うまくいきました。

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


4

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


2
私はわからないということは良いアイデア。それはクラッシュを遅らせるかもしれませんが、より多くのダメージを与えることを犠牲にして。あなたがクラッシュするなら、最良のアイデアは早くクラッシュすることだと思います:-)
paxdiablo 2010年

1
DEPをオフにすることは賢明ではありませんが、診断に役立ちます。
vcsjones 2010年

4

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


私は同じ問題に直面しています-autocad .net dll-問題と修正について詳しく説明できますか?
BKSpurgeon 2017

3

この問題はほとんど常に単純なものです。コードが悪いです。それは、統計分析からのツールではありません。何百万人もの人々が毎日Visual Studioを使用しており、おそらく数人があなたのコードを使用しています-どのビットのコードがより良いテストをしていますか?これがVSの問題である場合は、おそらくすでに発見されていると思います。

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

メモリが破損している場合、エラーの捕捉がエラーの根本原因に近いことはほとんどありません。そして、効果は、あなたが説明したとおりであり、一見ランダムです。次のような通常の犯人を調べる必要があります。

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

根本的な原因を見つけるために、このような問題から逆方向に働くことである信じられないほどそんなに問題の作成と問題の検出との間で起きている可能性があること与えにくいです。

私は主にそれが何を見ていた方が簡単です見つける壊れて(たとえば、特定のポインタを)して、上記のように通常の犯人をチェックし、それが破損している可能性がものを見るために、コードの手動静的解析を行います。ただし、これでも長い問題の連鎖を捉えることはできません。

私はVSに精通していませんが、メモリ追跡ツール(Linuxのvalgrindなど)を使用して、明らかな問題を特定できるかどうかを確認することもできます。


3
不良メモリから破損したポインタを取得することもできます。ECCメモリを搭載したサーバーでこれが発生しない場合は、長時間実行されるメモリテストユーティリティを試して、ハードウェアを原因から排除してください。
cdonner 2010年

12
ハードウェアの問題ではなく、複数のサーバーで発生することがわかっています。コードキャプテンに明らかな問題があることを示してくれてありがとう。私はビジュアルスタジオを非難していません。前述のように、アプリケーションはランダムな期間正常に動作します。再現するのは簡単ではなく、私は今週問題を特定しようと努めてきました。
誰か2010年

5
@誰か他:名前の呼び出しがあなたに多くの助けを与えるだろうとはほとんど思いません。
ミッチウィート

2
@誰か他の人、私はあなたが提供した限られた情報を与えることができる限り私は助けました。世界で最も優れた医師でさえ、「私は傷ついている」と単純に述べている患者には多くのことを行うことができません:-)より具体的な情報を提供したい場合は、さらにお手伝いできます。
paxdiablo 2010年

5
悪い答えですが、アプローチ、恥知らずな憶測、不当な仮定、解決策が提供されていません...なぜこの答えはまだ有効なのですか?そして、この答えを支持した可能性のある3人は何でしょうか?
ThunderGr 2014

3

検証可能なコードはメモリを破壊することができないはずなので、安全でないことが起こっています。バッファ処理など、安全でないコードをどこかで使用していますか?また、PInvokeはアンマネージコードおよび関連するマーシャリングへの移行を伴うため、PInvokeに関するものは無関係ではない場合があります。

クラッシュしたインスタンスにアタッチし、WinDBGとSOSを使用して、クラッシュ時に何が起こっているかをさらに詳しく調べることをお勧めします。これは気弱な人のためではありませんが、この時点で、より強力なツールを作成して、何が問題なのかを正確に特定する必要があるかもしれません。


エラーメッセージの考えられる原因としてPInvokeについて言及しています。安全でないコードはありません。WinDBGを試してみます。ありがとう。
誰か他の人

3

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

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

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

そしてそれはうまくいった。

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

図に行く...


3

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

の代わりに

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

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

StringBuilder windowText = new StringBuilder(3000);

2

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

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

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


1

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


1

VS1017で、前日に完全に正常にビルドされていたプロジェクトをビルドしようとしたときに、このエラーがランダムに発生しました。PCを再起動すると問題が解決しました(必要に応じて、次のコマンドも事前に実行しました。netshwinsock reset)


1
それはまさにVS 2017の私の状況です-System.AccessViolationException:保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。私は何もせずにこの問題を解決するために単にPCを再起動しました。
香港

0

私の答えはあなたのシナリオに大きく依存しますが、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)"

これは、実行可能ファイルをデータ実行防止と互換性がないものとして明示的に指定します。詳細はこちらをご覧ください。


0

場合によっては、これは次の場合に発生することがあります。

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

0

私の場合、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

これは、Visual StudioでC#WinFormsアプリケーションをデバッグしているときに起こりました。私のアプリケーションは、DllImportを介してWin32のものを呼び出します。

[DllImport("Secur32.dll", SetLastError = false)]
private static extern uint LsaEnumerateLogonSessions(out UInt64 LogonSessionCount, out IntPtr LogonSessionList);

「管理者として」Visual Studioを実行すると、問題が解決しました。


0

私は同じエラーメッセージを持っていました:

System.AccessViolationException:保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。

私の場合、クリーンアップしてソリューションを再構築した後、エラーはなくなりました。


0

私の場合、FTDIユーティリティのFT ProgがUSBデバイスをスキャンするときにエラーをスローしていました。BluetoothヘッドフォンをPCから取り外すと、問題が解決しました。


0

オブジェクトのコレクションをフィルター処理するためにLinqを使用していたラムダ式でこのエラーメッセージが表示されました。コレクションを調べたところ、メンバーが入力されていないことに気付きました。Localsウィンドウで、それらを展開すると、「...」と表示されました。最終的に問題は、最初にコレクションにデータを入力したリポジトリメソッドにありました-Dapperはネストされたオブジェクトのプロパティを自動的にマップしようとしました。Dapperクエリを修正してマルチマッピングを処理し、メモリエラーを修正しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.