Отладка модульных тестов, которые не выполняются из-за исключения StackOverflow - программирование
Подтвердить что ты не робот

Отладка модульных тестов, которые не выполняются из-за исключения StackOverflow

Всякий раз, когда unit test выходит из строя из-за StackOverflowException, процесс unit test немедленно выходит из системы - единственный способ узнать, что произошло (что я знаю), - это отладка дампа сбоя процесса unit test полученный путем выполнения описанных здесь шагов

Каков самый простой способ получить имя unit test, которое было запущено во время создания StackOverflowException? Даже при отладке unit test я изо всех сил пытаюсь найти имя текущего unit test в качестве его нижней части стека, а Visual Studio не будет показывать весь стек в окне отладки, потому что он слишком большой.

Есть ли способ узнать, с каким unit test не удалось выполнить сбор и отладки аварийных дампов?

4b9b3361

Ответ 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 Qaru exception
            throw new StackOverflowException();
        }
    }