2017-06-09 12 views
1

C#のVisual Studio 2015では、プログラムをデバッグします。デバッガはどこかに一時停止し、System.StackOverflowExceptionが発生します。`System.StackOverflowException`が発生したときに一番外側のスタックを見つける方法は?

型「System.StackOverflowException」の未処理の例外がmscorlib.dll

で発生したことが起こっている無限の再帰があることを意味します。

最初にどのメソッドが呼び出されたかを調べてから例外が発生するので、コールスタックウィンドウを参照していますが、最もスタックが多くコールスタックウィンドウから切り捨てられています:

...
のVisual Studio でサポートされているスタックフレームの最大数を超えています。

  • System.StackOverflowExceptionが発生したときに、アウトほとんどを見つけるためにいくつかの方法がスタックありますか?

  • System.StackOverflowExceptionが発生する前にスタックフレームの最大数を制限する方法はありますか?そのため、すべてのスタックフレームをコールスタックウィンドウに表示できますか?

ありがとう。

+0

初めて、私はStackoverflow例外に直面したときに常にコールスタックを調べることができる、その2番目のメッセージを参照してください。 –

+0

コールサイクルがどこにあるのかを確認してそこから作業するのにスタックが十分に見えませんか? – Chris

+0

[ETWをトレースしてException raisingをトレースする](https://stackoverflow.com/a/30289933/1466046)を使用すると、例外が発生したときのスタックが表示されます。 WPRと私のプロファイルを使用してデータをキャプチャし、WPAでETLを分析する – magicandre1981

答えて

2

すべてのスタックフレーム は、コールスタックウィンドウに表示することができるように上げて System.StackOverflowException前のスタック・フレームの最大数を制限するいくつかの方法が、ありますか?

一時的なハック:原因が分かるまで、スタックフレームを小さくします。次に、サイズをデフォルトに戻します。そこには、このプロジェクトの設定はありませんが、この古いトリックはまだうまくいくかもしれない:

EDITBIN.EXE /STACK:<stacksize> file.exe 

は System.StackOverflowExceptionが発生したときに、アウトほとんどを見つけるためにいくつかの方法がスタックありますか?

1つのアプローチは、TraceまたはDebugクラスを使用して、再帰関数関数が何であれすべての呼び出しのログを追加することです。

Trace.WriteLine("Foo calling Cursed()"); 
... 
Trace.WriteLine("Bar calling Cursed()"); 

あなたが望む任意の変数を追加することができます:「呪われた()」各1つの前のコールにトレースを追加呼び出すコード内の10ヶ所がある場合、この関数は「呪われた()」を呼び出します。デバッグを見たり、出力をトレースする場合は、その後どのような機能を参照https://support.microsoft.com/en-us/help/815788/how-to-trace-and-debug-in-visual-c

-

あなたは、「Visual C#でトレースとデバッグする方法」、support.microsoft.comでトレースとデバッグを使用する方法を見ることができます値によって無限再帰がトリガーされました。

さらにロギング、アサート、条件付きブレークポイントを追加すると、より多くのものを絞り込むことができます。

0

私のRuntime Flowツール(30日間の試用版)でプログラムを実行することができ、StackOverflowExceptionの前にすべてのメソッド呼び出しを見ることができるはずです。

関連する問題