7

wkhtml2pdf を呼び出す Rotativa を呼び出すコードがいくつかあります。wkhtml2pdf.exe が Corrupted State Exception (CSE) をスローする原因になっていると思われます。CSE がスローされた場合は、それをキャッチしてログに記録したいので、CSE が発生している場所を追跡できます。

デバッガーでアプリを一晩実行したままにしておくと、戻ってくると VS がシャットダウンされます。再起動することもあれば、再起動しないこともあります。メモリ破損の疑い 私は調査を開始し、CSE 処理に出くわしました。

私はこのようなことをしています:

[HandleProcessCorruptedStateExceptions]
void DoStuff()
{
     try
     {
          DOThatThingThatMakesTheDebuggerHaltAndShutDown();
     }
     catch(Exception ex)
     {
            //how do I detect that it's a CSE in here, so I can log it especially blatantly
     }
}

例外が General Catch の CSE であるかどうかを検出する方法はありますか?

私は、2 つの一般的な例外条項があるところを見ました。内側のものは CSE を処理せず、フラグを設定します。外側のものがフラグなしで呼び出された場合、それは CSE ですが、よりクリーンなものを望んでいます。私がやりたいのは、この悪い状態をログに記録し、それをアプリケーションに渡して正常にバブルアップさせることです。

VS2013 をダウンさせたイベント ログのエラーを見ると、次のようになります。

アプリケーション: devenv.exe フレームワーク バージョン: v4.0.30319 説明: 未処理の例外のため、プロセスが終了しました。例外情報: 例外コード c0000005、例外アドレス 4DA44C1F スタック: Microsoft.VisualStudio.Debugger.Clr.NativeDkmClrModuleInstance.ProcF4BC786AEBAC294EE9C4C0BB1B0F56A7 (IntPtr、IntPtr ByRef) で Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance.GetMetaDataImport() で Microsoft.IntelliTrace.IntelliTrace. .MetadataHelper..ctor(Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance) Microsoft.IntelliTrace.Concord.Integration.CpdeNotifyPointServiceAdapter.InstallBreakpoint(Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance、Microsoft.VisualStudio.Debugger.Interop.Internal.NP_INSTALL_REQUEST で)
Microsoft.IntelliTrace.Concord.Integration.CpdeNotifyPointServiceAdapter.BindToModule (Microsoft.VisualStudio.Debugger.Clr.DkmClrModuleInstance) で Microsoft.IntelliTrace.Concord.IntelliTraceProcessState.AlertModuleLoad (Microsoft.VisualStudio.Debugger.DkmModuleInstance) で Microsoft.IntelliTrace.Concord.NotifyPoints .NotifyPointManager.OnModuleInstanceLoad(Microsoft.VisualStudio.Debugger.DkmModuleInstance、Microsoft.VisualStudio.Debugger.DkmWorkList、Microsoft.VisualStudio.Debugger.DkmEventDescriptorS) Microsoft.VisualStudio.Debugger.EntryPoint.IDkmModuleInstanceLoadNotification_OnModuleInstanceLoad(IntPtr、IntPtr、IntPtr、IntPtr)

これに続いて:

障害が発生しているアプリケーション名: devenv.exe、バージョン: 12.0.30501.0、タイム スタンプ: 0x5361f453 障害が発生しているモジュール名: vsdebugeng.impl.DLL、バージョン: 12.0.30501.0、タイム スタンプ: 0x5361f482 例外コード: 0xc0000005 障害オフセット: 0x00094c1f 障害が発生しているプロセス ID: 0x1c9c 障害のあるアプリケーションの開始時間: 0x01cfe7cc0cf50465 障害のあるアプリケーションのパス: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe 障害のあるモジュールのパス: C:\Program Files (x86)\Microsoft Visual Studio 12.0\ Common7\Packages\Debugger\vsdebugeng.impl.DLL レポート ID: 097b17c6-5438-11e4-8409-001f2904053c

4

1 に答える 1

4

「CorruptedStateException」のようなものはないことに注意してください。これは単なるコレクター ワードであり、CLR チームが「過度に厄介」として選んだ一連の例外です。彼らは意図的に、そのセットにどのような種類の例外を配置したかを文書化していませんが、「約 12 個」あり、それらが Windows SEH 例外として開始されたことを除きます。そのセットに間違いなく含まれていることを私が知っているのは、AccessViolationException だけです。あなたのケースでVSをクラッシュさせたもの。彼らが来るのと同じくらい厄介です。

この機能は .NET 4.0 に追加され、.NET 4.0 を使用してすべての例外処理をキャッチするプログラマーを支援しますcatch (Exception)。そして、プログラムを実行し続けます。これにはひどくバイトするコツがあり、回復不能であることが保証されているため、決してキャッチしてはならない種類の本当に厄介な例外もキャッチします。しばしば無意識に。これが原因で発生するプログラムの障害は、診断が非常に難しく、不正な動作が検出されるまでに時間がかかる場合があります。

セット内に他にどのような SEH 例外があるかを推測できます。しかし、それは単なる推測です。重要な点は、あなたが知る必要がないということです。[HandleProcessCorruptedStateExceptions] を持つすべてのメソッドは、スレッド エントリでアクティブ化される外部例外ハンドラーである必要があります。Main() のように。また、SEH ハンドラーが行うべきことはほとんどなく、プログラムが失敗した理由をユーザーに知らせて、Environment.FailFast() を呼び出すだけです

catch (Exception) そのため、属性を使用しないプログラミングは問題なく、CLR はハンドラーを探すときにそれをスキップします。厄介なものを誤って飲み込むことはありません。あなたのケースはおそらく少し異なり、明確に定義されたスレッド エントリポイントのないアドインのように見えます。try/catch を使用してメソッドの本体を別のメソッドに移動し、そのメソッドの属性を省略します。属性を持つメソッドによって呼び出されるために、厄介なものの 1 つをキャッチしたと安全に想定できるようになりました。

もちろん、キャッチしたときにVSを実行したままにしないでください。デバッガーの状態は粉々に吹き飛ばされ、デバッグ セッションはほぼ確実に終了します。プログラマーはデバッガーを使い続けようとしてもうまくいきません。そのため、メッセージ ボックスを表示してフェイルファストまたは再スローします。

于 2014-10-15T16:23:09.780 に答える