アプリケーションが「.NETランタイムの内部エラー」でクラッシュする


112

.NET 4.0に対して作成されたアプリケーションがあり、週末にクラッシュし、次のメッセージがイベントログに記録されました。

アプリケーション:PnrRetrieverService.exe Frameworkバージョン:v4.0.30319
説明:終了コード80131506のIP 791F9AAA(79140000)での.NETランタイムの内部エラーのため、プロセスが終了しました。

これは、Windows Server 2003 R2 Standard Editionボックスにあります。このエラーをグーグルしても、関連することは何もありません。たとえば、これはVS Studioでは発生せず、プロダクションボックスで発生します。サービスが最終的に再起動されたとき、それ以上の問題は発生しませんでした。

.NETランタイムのバグを診断するにはどうすればよいですか?


1
このエラーが初めて発生した場合は、ここ数日から1週間で変更されたものを調べます。
トニーエイブラムス

回答:


121

終了コード80131506

厄介なのは、ExecutionEngineExceptionです。.NET 4.0以降、この例外はプログラムを即座に終了させます。一般的な原因は、ガベージコレクションされたヒープの状態の破損です。これは、常にアンマネージコードによって引き起こされます。この例外が発生するコード内の正確な場所は役に立ちません。通常、破損が検出される前に破損が発生しました。

これの正確な原因を見つけるのは難しいでしょう。サービスが使用している可能性のあるアンマネージコードを確認します。明らかな候補がない場合は、環境問題の疑いがあります。不正な動作をするマルウェアスキャナーは悪名高いです。繰り返しが非常に少ない場合は、ソフトRAMエラーなどのハードウェアの問題を疑います。


3
SQL CE 3.5でヒープが破損し、ntdll.dllおよび.NETランタイムエラーで例外が発生する問題がありました。
Phil

4
これらはSDKヘッダーファイルCorError.hにリストされています
Hans Passant

2
CorError.hにリストされていることをどのようにして知りましたか?
Yeonho

6
このErr.exeツールmicrosoft.com/en-au/download/details.aspx?id=985を使用して、80131506のような16進数のエラーコードが何を意味し、どのヘッダーファイルにそれらが含まれているかを調べます。
ジェレミー・トンプソン

2
@HansPassant私が意図した質問は「世界に存在するすべてのファイルの中で、CorError.hが注目に値するファイルであることをどのようにして知りましたか」と思いました。
bacar

41

x64 .Net 4でのガベージコレクションの同時実装のバグは、次のMicrosoft KBエントリに記載されているようにこれを引き起こす可能性があります。

ガベージコレクション中にExecutionEngineExceptionが発生する

最初に詳細なミニダンプ調査を行って、ガベージコレクション中に問題が発生したことを確認する必要があります。

ミニダンプの場所は通常、クラッシュエントリに続くイベントログのWindowsエラー報告エントリにあります。次に、WinDbgをお楽しみください。

<gcConcurrent/>同時または(.NET 4以降では)バックグラウンドガベージコレクションを無効にするための構成要素の使用に関する最新のドキュメントは、こちらにあります


このコメントをありがとう-これは私が長い間抱えていた問題の解決策でした!
lenniep 2013年

1
あなたは命の恩人です、これは私たちの問題でした。余談ですが、ミニダンプファイルをVisual Studioで開いて、必要に応じてシンボルパスを設定し、デバッグすることもできます。これにより、エラーはclr.dll!WKS :: gc_heap :: mark_object_simple()で発生することがわかりました。WinDbgは非常に強力ですが、VSを使用すると、エラーの原因を確認しているだけで十分なことがわかります。
ティム

アプリケーションはクラッシュしましたが、C:\ Temp \ CrashDumpフォルダーにミニダンプが見つかりませんでした。他にもいくつかのクラッシュダンプがあり、数日前のクラッシュからのダンプを見つけることができます。クラッシュダンプがない理由を知っていますか?エラーメッセージと終了コードはまったく同じです。
Jeffrey Zhao

これはまさに私が探していたものです...アプリのクラッシュイベントには、ダンプがなければ役に立たない命令ポインタが含まれていました。後のイベントを探すとは思わなかった。ありがとうございました!
laindir 2017

1
同じ状況で他の人のために、クラッシュの完全なヒープ・ダンプを行うにはWindowsエラー報告を構成することが有用であり得る:msdn.microsoft.com/en-us/library/windows/desktop/...
laindir

9

コードのバグが原因であることが判明した.NETランタイムで「内部エラー」が発生しました。根本的な原因としてコードにバグがないのは、それが.NETランタイムの「内部エラー」であったという理由だけではありません。他の人のせいにする前に、常に自分のコードのせいにしなさい。

うまくいけば、ロギングと例外/スタックトレース情報があり、どこから探し始めるか、またはクラッシュ前のシステムの状態を繰り返すことができます。



5

何年にもわたって多くのアプリケーションでこの問題に取り組んできましたが、Microsoftは.NET 4 CLRのバグとして、これを引き起こすバグとしてようやく受け入れたようです。http://support.microsoft.com/kb/2640103

Think Before CodingがリンクしているMicrosoftの記事で説明されているように、以前はガベージコレクターをサーバーモード(app.configのgcServer enabled = "true")で実行するように強制して「修正」していた。これは本質的に、アプリケーションのすべてのスレッドを強制的に収集中に一時停止させ、他のスレッドがGCによって操作されているメモリにアクセスする可能性を排除します。私のコードではなく、Microsoftのコードにバグが存在していたため、コードや他のサードパーティのアンマネージライブラリの「バグ」を探すのに何年も無駄になっていたことをうれしく思います。


1
受け取ったHotFixファイルのバージョン番号は何ですか?KBに記載されているバージョン番号は4.0.30319.526ですが、すでに4.0.30319.18052を持っています。HotFixはまだ必要ですか、それともWindows Updateに含まれていますか?
2013年

1
HotFix exeを実行すると、「KB2640103が適用されないか、コンピューターの別の条件によってブロックされています」と表示されます。
自動化


3

私の.NET 4コードの最新ビルドで、WinXPボックスでまったく同じエラーが発生しました。以前のビルドを確認しました-今度はクラッシュします!わかりましたので、私ではありません :) ここ/上記の提案は役に立ちませんでした。

同じ問題に関するより最近の(2018-05-09)レポート:終了コード80131506によるアプリケーションクラッシュ

A:同様のエラーが発生しましたが、Citrixメモリーオプティマイザーが原因であると考えられます。
解決策は、問題が発生していたホストで.Netコアライブラリを強制的に再生成することでした。
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe update /force

根本的な原因はまだ不明です(マシンは更新されておらず、ほとんど使用されていません)が、私にはそれ実現しました


2

私の場合、この例外はディスク領域がいっぱいになり、.NETがWindows仮想メモリにメモリを割り当てることができないときに発生しました。

イベントログに次のエラーが表示されました。

アプリケーションポップアップ:Windows-Virtual Memory Minimum Too Low:システムの仮想メモリが不足しています。Windowsは仮想メモリページングファイルのサイズを増やしています。このプロセス中に、一部のアプリケーションのメモリ要求が拒否される場合があります。

そして以前のエラー:

C:ディスクの容量が限界に近づいている。一部のファイルを削除する必要がある場合があります。


1

私の場合、問題はNtQuerySystemInformationへの呼び出しがあったC ++ / CLIライブラリでした。ある種の理由で(そして不思議な状況下で)、CLRヒープが呼び出されたときに破損し、アプリケーションがクラッシュしました。

HeapCreateで作成された「カスタムヒープ」を使用して、その関数で使用されるバッファーを割り当てる問題を解決しました。


1

それがみんなを助けるかもしれないとは思いませんが、実行することでこれを回避できました

devenv.exe /ResetSettings 

...パス内 {Visual_Studio_root}\Common7\Ide

イベントログに次のエラーがあり、VSが常にクラッシュして再起動していました。

Faulting application name: devenv.exe, version: 14.0.25123.0, time stamp: 0x56f22f32
Faulting module name: clr.dll, version: 4.7.2115.0, time stamp: 0x59af88f2
Exception code: 0xc0000005
Fault offset: 0x0015f90e
Faulting process id: 0x3a7c
Faulting application start time: 0x01d353463eaf0c36
Faulting application path: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Report Id: a232f984-6e80-4f61-9003-e18a035c8f93
Faulting package full name: 
Faulting package-relative application ID: 

これも私にとってはうまくいきました。コンテキスト:中規模のソリューション(約25プロジェクト)を.NET Core SDKに変換しました。その前に、変換前に古いWAPを置き換えたほとんど空のWebアプリケーションプロジェクトがありました。どうやら、長引く設定のいくつかは、新しいプロジェクトでのIISExpressの期待と衝突していたようです。
Tomas Aschan

1

私の場合、問題は私のweb.config内の重複するバインディングリダイレクトが原因でした。詳細はこちら

NuGetがバインディングリダイレクトを変更したためだと思いますが、たとえば次のようになっています。

  <dependentAssembly>
    <assemblyIdentity name="Lucene.Net" publicKeyToken="85089178b9ac3181"/>
    <bindingRedirect oldVersion="0.0.0.0-2.9.4.0" newVersion="3.0.3.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
    <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Lucene.Net" publicKeyToken="85089178b9ac3181"/>
    <bindingRedirect oldVersion="0.0.0.0-2.9.4.0" newVersion="3.0.3.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
    <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0"/>
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0"/>
  </dependentAssembly>

すべての重複を削除すると問題が解決しました。


0

私の場合、SAP Business One 9.1アプリケーションにログインするときにこのエラーが発生しました。Windowsイベントでは、OPによって報告されたものに加えて、別のエラーイベントも見つけることができました。

Nome dell'applicazione che ha generato l'errore: SAP Business One.exe, versione: 9.10.160.0, timestamp: 0x551ad316
Nome del modulo che ha generato l'errore: clr.dll, versione: 4.0.30319.34014, timestamp: 0x52e0b784
Codice eccezione: 0xc0000005
Offset errore 0x00029f55
ID processo che ha generato l'errore: 0x1d7c
Ora di avvio dell'applicazione che ha generato l'errore: 0x01d0e6f4fa626e78
Percorso dell'applicazione che ha generato l'errore: C:\Program Files (x86)\SAP\SAP Business One\SAP Business One.exe
Percorso del modulo che ha generato l'errore: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
ID segnalazione: 3fd8e0e7-52e8-11e5-827f-74d435a9d02c
Nome completo pacchetto che ha generato l'errore: 
ID applicazione relativo al pacchetto che ha generato l'errore: 

マシンはWindows 8.1を実行し、.NET Framework 4.0がインストールされ、4.5バージョンはインストールされていません。インターネットからは.NET 4のバグである可能性もあると思われたので、.NET Framework 4.5.2インストールしてみて問題を解決しました。


0

フレームワークバージョン:v4.0.30319説明:未処理の例外が原因でプロセスが終了しました。例外情報:System.Reflection.TargetInvocationException

このエラーに直面しました。一部のPCおよび一部のPCでアプリケーションが正常に動作し、上記のエラーが発生しました。Framework 4.5をアンインストールし、再インストールして問題を解決しました。

乾杯。


0

これは、ファイナライザで発生する例外である可能性があります。〜Class(){Dispose(false);のパターンを実行している場合 非管理対象リソースとして何を破棄するかを確認します。そこにtry..catchを置くだけで大丈夫です。

ログがないという不可解なエラーが発生したため、問題が見つかりました。「void Dispose(bool disposing)」を使用するという通常の推奨パターンを実行しました。

ファイナライザに関するこの質問の回答を見てみると、アンマネージリソースの破棄が例外をスローする可能性のある場所が見つかりました。

オブジェクトが適切に破棄されなかったことが判明したため、ファイナライザがアンマネージリソースの処理を引き継いだため、例外が発生しました。

この場合、Kafka Rest APIを使用して、Kafkaからクライアントをクリーンアップしました。ある時点で例外が発生したようで、この問題が発生しました。



0

なぜこれが私のために起こったのか、私には決してわかりませんでした。それは私のアプリケーションの1つで一貫して再現可能でしたが、単に再起動しただけでなくなりました。

私はWindows 2004ビルド19582.1001(Insider Preview)を.net-4.8で実行していますが、これがハードウェアメモリエラーのようなものであったとしても、驚くことはありません。また、私のアプリケーションはアンマネージコードをいくつかロードして初期化するため、クラッシュがその原因ではないことを証明できません。


-1

アプリケーションプールが5〜10分ごとにこの終了コードでクラッシュし続けました。ガベージコレクターの信頼を台無しにしたくはありませんが、次の解決策がうまくいきました。

呼び出すジョブを追加しました GC.GetTotalMemory(true)毎分。

何らかの理由で、私が使用する多数の使い捨てオブジェクトに対して、GCがメモリを自動的に頻繁に検査していないと思います。

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