1

少なくとも管理対象アプリの終了を延期し (数十ミリ秒)、共有フラグを設定して他のスレッドに正常に終了する機会を与える方法はありますか (SO スレッド自体は明らかにそれ以上何も実行しません)。これに JIT デバッガーまたは CLR ホスティングを使用することを考えています。

なぜ私は何か間違ったことをしたいのですか?:

あまり詳しく説明しなくても、この類推を想像してみてください。あなたはカジノでルーレットに賭けていて、突然ルーレットが信頼できない偽物であることがわかりました。したがって、すぐにカジノを離れたいと思うかもしれませんが、最初にテーブルからベットを回収したいと思うでしょう。残念ながら、非常に厳しいパフォーマンス要件があるため、これに別のプロセスを利用することはできません。

試してみましたがうまくいきませんでした:

StackOverflowException (および MSDN の矛盾する情報) に対する .NET の動作については、SO で何度か議論されています。

HandleProcessCorruptedStateExceptionsAttribute (たとえば、appdomain の未処理の例外ハンドラー) が機能しない

ExecuteCodeWithGuaranteedCleanupが機能しない

legacyUnhandledExceptionPolicyが機能しない

StackOverflowExceptions を処理する他の試みはほとんどないかもしれませんが、Hans Passant によるこの素晴らしい回答で言及されているように、CLR がプロセス全体を終了させることは明らかです。

試してみることを検討してください:

  • JIT デバッガー - 例外を凍結した状態でスレッドを残し、いくつかの共有フラグを設定し (ピン留めされた場所にある可能性が高い)、短時間他のスレッドを解凍します。
  • CLR のホスティングと未処理の例外ポリシーの設定

他に何か考えはありますか?または、これら 2 つの方法での経験 (成功/失敗) はありますか?

4

2 に答える 2

3

AStackOverflowExceptionは、ランタイムが回復できない即時かつ重大な例外です。そのため、それをキャッチしたり、回復したりできません。別のメソッドを実行するには (それがクリーンアップ メソッドであろうとその他のものであろうと)、そのメソッドのスタック フレームを作成できる必要があり、スタックは既にいっぱいです(それがStackOverflowException意味することです!)。そもそもメソッドの実行が例外の原因であるため、別のメソッドを実行することはできません!

幸いなことに、この種の例外は常にプログラムの構造によって引き起こされます。コード内のエラーを診断して修正できるはずです。例外が発生すると、コール スタックに、1 つ以上のメソッドが無期限に再帰するループがあることがわかります。問題のあるロジックを特定して修正する必要があります。これは、修正不可能な例外を修正しようとするよりもはるかに簡単です。

于 2014-07-24T08:46:00.957 に答える