16

単体テストプロセスがすぐに終了するために単体テストが失敗するときはいつでも、StackOverflowException何が起こったのかを知る唯一の方法 (私が知っていること) は、ここにある手順に従って取得した単体テストプロセスのクラッシュダンプをデバッグすることです

StackOverflowExceptionがスローされたときに実行されていた単体テストの名前を取得する最も簡単な方法は何ですか? 単体テストをデバッグしているときでも、スタックの一番下にある現在の単体テストの名前を見つけるのに苦労しており、Visual Studio は大きすぎるため、デバッグ ウィンドウにスタック全体を表示しません。

クラッシュ ダンプを収集してデバッグせずに、失敗した単体テストを特定する方法はありますか?

4

2 に答える 2

1

RuntimeHelpers.EnsureSufficientExecutionStackメソッド(http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.runtimehelpers.ensuresufficientexecutionstack.aspx )を見てください。InsufficientExecutionStackException事前に取得するために、再帰メソッドでそれを呼び出すことをお勧めします。

于 2013-03-12T19:29:06.177 に答える
1

この他の質問で述べたように、自分でスローしない限り、スタック オーバーフロー例外を実際にキャッチすることはできません。

したがって、問題の回避策 (実際には解決策ではありません) として、コードにメソッド呼び出しを挿入してスタック オーバーフローを検出し、例外を手動でスローして後でキャッチすることができます。

[TestClass]
public class TestStackOverflowDetection
{
    [TestMethod]
    public void TestDetectStackOverflow()
    {
        try
        {
            InfiniteRecursion();
        }
        catch (StackOverflowException e)
        {
            Debug.WriteLine(e);
        }
    }

    private static int InfiniteRecursion(int i = 0)
    {
        // Insert the following call in all methods that
        // we suspect could be part of an infinite recursion 
        CheckForStackOverflow(); 

        // Force an infinite recursion
        var j = InfiniteRecursion(i) + 1;
        return j;
    }

    private static void CheckForStackOverflow()
    {
        var stack = new System.Diagnostics.StackTrace(true);
        if (stack.FrameCount > 1000) // Set stack limit to 1,000 calls
        {
            // Output last 10 frames in the stack
            foreach (var f in stack.GetFrames().Reverse().Take(30).Reverse())
                Debug.Write("\tat " + f);

            // Throw a stack overflow exception
            throw new StackOverflowException();
        }
    }
于 2013-03-12T17:41:42.073 に答える