web-dev-qa-db-ja.com

.NET 4.5:.NETランタイムの内部エラー(80131506)/同時GCの無効化

長時間実行される.NET 4.5アプリケーションがランダムにクラッシュし、質問のタイトルで言及したメッセージがイベントログに残ります。この問題は、3つの異なるマシンと2つの異なるシステム(2008 R2および2012)で再現されます。アプリケーションは安全でない/管理されていないコンポーネントを使用せず、純粋に管理された.NETであり、管理されていないものはCLR自体のみです。

ダンプから抽出したクラッシュサイトのスタックトレースは次のとおりです。

clr.dll!MethodTable::GetCanonicalMethodTable()  
clr.dll!SVR::CFinalize::ScanForFinalization()  - 0x1a31b bytes  
clr.dll!SVR::gc_heap::mark_phase()  + 0x328 bytes   
clr.dll!SVR::gc_heap::gc1()  + 0x95 bytes   
clr.dll!SVR::gc_heap::garbage_collect()  + 0x16e bytes  
clr.dll!SVR::gc_heap::gc_thread_function()  + 0x3e bytes    
clr.dll!SVR::gc_heap::gc_thread_stub()  + 0x77 bytes    
kernel32.dll!BaseThreadInitThunk()  + 0x1a bytes    
ntdll.dll!RtlUserThreadStart()  + 0x21 bytes    

この問題は、議論されたものとよく似ています here なので、そのトピックで提案されている解決策を試しましたが、どれも役に立ちませんでした:

  • this hotfixをインストールしようとしましたが、どのマシンにもインストールされません(KB2640103が適用されないか、コンピューターの別の条件によってブロックされています)。 4.0ではなく4.5を使用しています。

  • 同時GCを無効にしたり、サーバーGCを有効にしたりしました。現在、私のapp.configの関連部分は次のようになっています。

    <?xml version="1.0"?>
    <configuration>        
        <runtime>
            <gcConcurrent enabled="false"/>
            <gcServer enabled="true" />
        </runtime>
    <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>    </startup></configuration>
    

奇妙なことに、私はまだプロセスダンプに複数のGC関連のスレッドを見つけます。クラッシュが発生したスレッドのほかに、次のスタックトレースを持つ7つのスレッドがあります。

ntdll.dll!NtWaitForSingleObject()  + 0xa bytes  
KERNELBASE.dll!WaitForSingleObjectEx()  + 0x9a bytes    
clr.dll!CLREventBase::WaitEx()  + 0x13f bytes   
clr.dll!CLREventBase::WaitEx()  + 0xf7 bytes    
clr.dll!CLREventBase::WaitEx()  + 0x78 bytes    
clr.dll!SVR::t_join::join()  + 0xd8 bytes   
clr.dll!SVR::gc_heap::scan_dependent_handles()  + 0x65 bytes    
clr.dll!SVR::gc_heap::mark_phase()  + 0x347 bytes   
clr.dll!SVR::gc_heap::gc1()  + 0x95 bytes   
clr.dll!SVR::gc_heap::garbage_collect()  + 0x16e bytes  
clr.dll!SVR::gc_heap::gc_thread_function()  + 0x3e bytes    
clr.dll!SVR::gc_heap::gc_thread_stub()  + 0x77 bytes    
kernel32.dll!BaseThreadInitThunk()  + 0x1a bytes    
ntdll.dll!RtlUserThreadStart()  + 0x21 bytes    

どういうわけか、コンカレントGCの無効化をなんとかして失敗させることができるかどうか疑問に思います(これが実際に構成をリストしたものです)。

私がこれまでに見つけたものをまとめると思います。この問題への対処方法について、いくつかの助けを借りることができました。

22
HellBrick

私のアプリケーションでの過去の経験を利用しています。これは、例外がファイナライザレベルまで処理されなかった場合に発生する可能性があり、例外が発生した場合...アプリケーションがクラッシュします。

GC構成で何かを行う前。

1つの簡単なチェック...タスク並列ライブラリを使用していますか? 「はい」の場合、例外を適切に処理していることを確認してください。異なるスレッドからの例外が処理されないままになっている場合は、ファイナライザーに到達すると、アプリケーションがクラッシュします。それらを適切に処理する方法はいくつかあります。 「集約」例外の処理は1つの方法です(以前に解決しました!)。

http://msdn.Microsoft.com/en-us/library/dd537614.aspx

コメントを追加するための50のポイントがないので、回答として追加します...

5
SridharVenkat

これは古い投稿だと思いますが、OPと同じ問題に遭遇しました。ポイントatlasteが作成されました:

ランタイムをx86またはx64に変更して、再試行してください。すでに試したように、同時GC設定をいじることもできます。

私にとって鍵でした。 1つを除いて、すべてのプロジェクトはAny CPに設定されました(偶然にも、コンソールアプリケーションプロジェクトであるアプリケーションのエントリポイント)。このプロジェクトはx86に設定されました。それをAny CPに変更すると、アプリケーションは正しく実行されました。

1
HighGuard2012

.NET 4.5デスクトップアプリでも同じ問題が発生しました-Webスクレイパー。高負荷時にランダムにクラッシュしました。そこで、数か月間何が原因だったかを突き止める方法を模索してきました。すべてを試しました! PhantomJSモジュールが原因でクラッシュが発生したことに気づくまで、同時GCを無効にし、サーバーモードに設定し、他の多くの回避策を実行します。それはいくつかのアンマネージリソースを使用し、その後それらをクリアしません:(したがって、PhantomJS統合用のスタンドアロンコンソールアプリを作成しました。ここで、このコンソールアプリをProcess.Startを使用してWebスクレイパーから実行し、後でそれを強制終了します。さらに時間がかかりますスクレイピング用ですが、これ以上クラッシュしません!

0
Daniel Vygolov

私を助けた解決策:.NET 4.5.1をアンインストールし、4.0をインストールし、言及された修正プログラムをインストールし、4.5.1を元に戻します。

0
Genrih

同様の問題を再現できたので、Microsoftとの会話を終了しました。

私の場合、それは.NETランタイムのバグであり、動的型と非動的コードの混在に関係しています。これがあなたのシナリオにも当てはまるかどうかはわかりませんが、いくつか試してみたいことがあります。

  • Windows 8.1でコードを実行します(最新の更新)。どうやらWindows 8.1は、他のバージョンのWindowsよりも新しいバージョンの.NETを持っています。
  • (私がしたように)AssemblyBuilderを使用している場合は、RunではなくRunAndCollectモードに変更してみてください。
  • ランタイムをx86またはx64に変更して、再試行してください。すでに試したように、同時GC設定をいじることもできます。
  • 私が話すように私のバグは修正されています。これは基本的に、それを処理するWindowsアップデートがあることを意味します。多分それは単にそれを待つオプションでもあります。多くのプログラムにとって非常に重要であるため、時間がかかりすぎるとは思いません。
0
atlaste

私の問題は、この終了コード(80131506)でアプリケーションプールがクラッシュし続ける5〜10分ごとに奇妙なことです。高スレッド操作/スケジュールタスクでガベージコレクターを推し進める必要があるかどうかはわかりませんが、次の解決策はここで機能しました。

GC.GetTotalMemory(true)を毎分呼び出すジョブを追加しました。何らかの理由で、私が使用する多数の使い捨てオブジェクトに対して、GCがガベージコレクターを自動的に頻繁に呼び出すことはないと思います。しかし、これは私の問題を解決します!それは最終的な解決策というよりは迅速な修正に似ています;)

0
Dave Lizotte

私はようやくインストールできる修正を見つけました。私も4.5を持っていて、4.0の他の修正がインストールされていませんでした。 4.5を削除しても修正されませんでした。リンクを修正して実際に修正しました。

http://kb.machsol.com/Knowledgebase/Article/50305

0
acheron55