연습 - 변수 및 실행 흐름 모니터링

완료됨

실행 및 디버그 뷰는 개발자에게 디버그 프로세스 중에 변수 및 식을 모니터링하고, 실행 흐름을 관찰하고, 중단점을 관리하는 쉬운 방법을 제공합니다.

실행 및 디버그 보기의 섹션 검사

실행 및 디버그 보기의 각 섹션은 고유한 기능을 제공합니다. 디버그 프로세스 중에 이러한 섹션의 조합을 사용하는 것이 도움이 되는 경우가 많습니다.

VARIABLES 섹션

변수 상태 모니터링은 코드 디버깅의 중요한 측면입니다. 변수 상태가 예기치 않게 변경되면 코드에서 논리 오류를 식별하는 데 도움이 되는 경우가 많습니다.

VARIABLES 섹션은 범위별로 변수를 구성합니다. Locals 스코프는 현재 범위(현재 메서드)의 변수를 표시합니다.

비고

콘솔 애플리케이션의 최상위 문 섹션은 자체 메서드로 간주됩니다. 라는 Main메서드입니다.

범위 이름의 왼쪽에 있는 화살표를 선택하여 표시된 범위를 확장(확장)할 수 있습니다. 변수와 개체를 전개할 수도 있습니다. 다음 스크린샷은 numbers 배열이 Locals 범위 아래에 펼쳐져 있는 모습을 보여줍니다.

실행 및 디버그 보기의 변수 섹션에서 전개된 변수를 보여 주는 스크린샷

VARIABLES 섹션을 사용하여 런타임 시 변수 값을 변경할 수도 있습니다. 변수 이름을 두 번 클릭한 다음 새 값을 입력할 수 있습니다.

보기 섹션

시간 또는 다른 메서드에서 변수 상태를 추적하려면 어떻게 해야 할까요? 매번 변수를 검색하는 것은 지루할 수 있습니다. 이것이 바로 WATCH 섹션이 편리한 곳입니다.

식 추가 단추(더하기 기호+로 표시됨)를 선택하여 볼 변수 이름 또는 식을 입력할 수 있습니다. 또는 VARIABLES 섹션에서 변수를 마우스 오른쪽 단추로 클릭하고 을 선택할 Add to watch수 있습니다.

WATCH 섹션 내의 모든 식은 코드가 실행될 때 자동으로 업데이트됩니다.

호출 스택 섹션

코드가 다른 메서드에서 메서드를 입력할 때마다 호출 계층이 애플리케이션의 호출 스택에 추가됩니다. 애플리케이션이 복잡해지고 다른 메서드에서 호출하는 메서드의 긴 목록이 있는 경우 호출 스택은 메서드 호출의 내역을 나타냅니다.

CALL STACK 섹션은 예외 또는 WATCH 식의 원본 위치를 찾으려고 할 때 유용합니다. 애플리케이션에서 예기치 않은 예외를 throw하는 경우 콘솔에 다음과 유사한 메시지가 표시되는 경우가 많습니다.

Exception has occurred: CLR/System.DivideByZeroException
An unhandled exception of type 'System.DivideByZeroException' occurred in Debug1.dll: 'Attempted to divide by zero.'
    at Program.<<Main>$>g__WriteMessage|0_1() in C:\Users\howdc\Desktop\Debug1\Program.cs:line 27
    at Program.<<Main>$>g__Process1|0_0() in C:\Users\howdc\Desktop\Debug1\Program.cs:line 16
    at Program.<Main>$(String[] args) in C:\Users\howdc\Desktop\Debug1\Program.cs:line 10

오류 메시지 아래에 들여쓰기된 줄 그룹을 at Program ... 스택 추적이라고 합니다. 스택 추적은 예외로 이어지는 호출된 모든 메서드의 이름과 원본을 나열합니다. 하지만 .NET 런타임의 정보도 포함할 수 있으므로 정보를 해독하기가 약간 어려울 수 있습니다. 이 예제에서는 스택 추적이 매우 깨끗하며 이름이 지정된 WriteMessage메서드에서 예외가 발생했음을 확인할 수 있습니다. 스택은 콘솔 애플리케이션의 최상위 수준 구문 섹션에 있는 Main이라는 메서드에서 시작됩니다.

CALL STACK 섹션을 사용하면 .NET 런타임 정보로 복잡한 스택 추적을 해독하는 문제를 방지할 수 있습니다. 사용자 고유의 코드에서 관련 메서드만 표시하도록 원치 않는 정보를 필터링합니다. 호출 스택을 수동으로 해제하여 예외가 발생한 위치를 확인할 수 있습니다.

브레이크포인트 섹션

BREAKPOINTS 섹션에는 현재 중단점 설정이 표시되며 디버그 세션 중에 특정 중단점을 사용하거나 사용하지 않도록 설정하는 데 사용할 수 있습니다.

애플리케이션 구성 및 시작 구성 설정

사용자 입력을 읽는 콘솔 애플리케이션에서 작업하는 경우 시작 구성 파일을 업데이트해야 할 수 있습니다.

  1. 다음과 같이 Program.cs 파일의 코드를 업데이트합니다.

    string? readResult;
    int startIndex = 0;
    bool goodEntry = false;
    
    int[] numbers = { 1, 2, 3, 4, 5 };
    
    // Display the array to the console.
    Console.Clear();
    Console.Write("\n\rThe 'numbers' array contains: { ");
    foreach (int number in numbers)
    {
        Console.Write($"{number} ");
    }
    
    // To calculate a sum of array elements, 
    //  prompt the user for the starting element number.
    Console.WriteLine($"}}\n\r\n\rTo sum values 'n' through 5, enter a value for 'n':");
    while (goodEntry == false)
    {
        readResult = Console.ReadLine();
        goodEntry = int.TryParse(readResult, out startIndex);
    
        if (startIndex > 5)
        {
            goodEntry = false;
            Console.WriteLine("\n\rEnter an integer value between 1 and 5");
        }
    }
    
    // Display the sum and then pause.
    Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex)}");
    
    Console.WriteLine("press Enter to exit");
    readResult = Console.ReadLine();
    
    // This method returns the sum of elements n through 5
    static int SumValues(int[] numbers, int n)
    {
        int sum = 0;
        for (int i = n; i < numbers.Length; i++)
        {
            sum += numbers[i];
        }
        return sum;
    }
    
  2. 코드를 검토하는 데 1분 정도 걸릴 수 있습니다.

    다음을 확인합니다.

    • 이 코드는 5개의 숫자를 포함하는 정수 배열을 지정합니다.
    • 코드는 콘솔에 출력을 표시합니다.
    • 이 코드는 배열 nn요소를 합산하는 데 사용하는 시작 요소 번호를 5 입력하라는 메시지를 표시합니다.
    • 코드는 메서드의 합계를 계산하고 콘솔에 결과를 표시한 다음 일시 중지합니다.

    비고

    디버그 콘솔 패널은 콘솔의 사용자 입력을 지원하지 않습니다.

  3. Visual Studio Code 파일 메뉴에서 저장을 선택합니다.

  4. 실행 메뉴에서 모든 중단점 제거를 선택합니다.

    이렇게 하면 이전 연습에서 남은 중단점이 제거됩니다.

  5. 실행 및 디버그 보기에서 디버깅 시작을 선택합니다.

  6. 코드 줄이 실행될 때 Console.Clear(); 오류가 발생합니다.

  7. 디버그 도구 모음에서 중지를 선택합니다.

  8. 탐색기 보기로 전환한 다음 편집기에서 launch.json 파일을 엽니다.

  9. 특성 값을 console 다음과 같이 업데이트합니다.

    "console":"integratedTerminal",
    
  10. Visual Studio Code 파일 메뉴에서 저장을 선택한 다음, launch.json 파일을 닫습니다.

애플리케이션 출력 검토 및 문제 식별

애플리케이션의 출력을 검토하면 코드를 작성할 때 간과했던 논리 문제가 표시될 수 있습니다.

  1. 실행 및 디버그 보기로 다시 전환합니다.

  2. 실행 및 디버그 보기에서 디버깅 시작을 선택합니다.

    DEBUG 콘솔 패널에 표시되는 메시지는 디버거가 Debug101.dll 애플리케이션에 연결되고 있음을 보여줍니다.

  3. 오류 메시지가 표시되지 않습니다.

    시작 구성 파일에서 console에서 integratedTerminal로 특성 값을 변경하면 콘솔 오류가 수정되었습니다. 하지만 이제 출력이 포함된 콘솔을 찾아야 합니다.

  4. 편집기 아래의 패널 영역에서 디버그 콘솔 패널에서 터미널 패널로 전환합니다.

  5. 사용자에게 값을 n입력하라는 메시지가 표시될 때 코드 실행이 일시 중지되었습니다.

    터미널 패널의 출력은 다음과 같습니다.

    
    The 'numbers' array contains: { 1 2 3 4 5 }
    
    To sum values 'n' through 5, enter a value for 'n':
    
  6. TERMINAL 명령 프롬프트에서 3을 입력합니다.

  7. 애플리케이션의 출력을 검토합니다.

    터미널 패널의 출력은 다음과 같습니다.

    
    The 'numbers' array contains: { 1 2 3 4 5 }
    
    To sum values 'n' through 5, enter a value for 'n':
    3
    
    The sum of numbers 3 through 5 is: 9
    press Enter to exit
    
  8. 잠시 시간을 내어 콘솔의 맨 위에 표시된 배열 요소 3~5의 값과 sum의 보고된 값을 고려해 보세요.

    메시지는 다음과 같습니다 The sum of numbers 3 through 5 is: 9. 그러나 배열 요소 3~5는 3, 45. 보고된 합계가 12여야 하지 않습니까?

    실행 및 디버그 보기의 VARIABLES 섹션을 사용하여 문제를 조사할 수 있습니다.

변수 상태 모니터링

경우에 따라 단순히 변수 상태를 모니터링하는 것만으로도 애플리케이션의 논리 문제를 식별할 수 있습니다.

  1. 다음 코드 줄에 중단점을 설정합니다.

    Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex)}");
    
  2. 실행 및 디버그 보기에서 디버깅 시작을 선택합니다.

  3. 디버그 콘솔 패널에서 터미널 패널로 전환합니다.

  4. TERMINAL 명령 프롬프트에서 3을 입력합니다.

    코드 실행은 중단점에서 일시 중지됩니다.

  5. 잠시 시간을 내어 실행 및 디버그 보기의 VARIABLES 섹션을 검토합니다.

    주의: startIndex에는 입력한 값 3이 할당되었습니다.

  6. 한 단계씩 코드 실행을 선택합니다.

  7. VARIABLES 및 CALL STACK 섹션이 업데이트됩니다.

    CALL STACK 섹션은 코드 실행이 메서드로 이동되었음을 보여 줍니다 SumValues .

    지역 변수를 나열하는 VARIABLES 섹션에는 정 n수의 값이 표시됩니다. 메서드 매개 변수 n 에 메서드 호출 인수 startIndex의 값이 할당됩니다. 이 경우 변수 이름을 변경하면 참조 포인터가 아니라 값이 전달되었음을 알 수 있습니다.

    비고

    이 경우 편집기에서 대부분의 코드를 볼 수 있으므로 CALL STACK 섹션이 필요하지 않을 수도 있지만, 깊이 중첩되고 상호 연결된 메서드 호출을 사용하여 더 큰 애플리케이션에서 작업하는 경우 CALL STACK 섹션에 표시된 실행 경로가 매우 유용할 수 있습니다.

  8. 에 할당된 값이 더 이상 sum이 되지 않을 때까지 0을 계속 선택합니다.

  9. 잠시 시간을 내어 VARIABLES 섹션에 표시된 정보를 검토합니다.

    다음이 표시되어야 합니다.

    실행 및 디버그 보기의 변수 섹션을 보여 주는 스크린샷

    sum에 할당된 값이 0에서 4로 변경된 것을 주목하세요.

  10. 배열을 numbers 확장하려면 숫자 [int[]]를 선택합니다.

    실행 및 디버그 보기의 변수 섹션에서 확장된 배열 요소를 보여 주는 스크린샷

  11. 배열 요소는 0부터 시작하는 인덱스 번호를 사용하여 액세스됩니다.

    이 경우 논리 오류는 사용자 인터페이스의 지침과 기본 코드 간의 불일치입니다. 사용자 인터페이스는 배열 항목 1-5를 참조합니다. 그러나 코드는 사용자가 입력한 값을 사용하여 0부터 시작하는 배열 요소에 액세스합니다. 3 인덱스에 있는 배열 요소는 4 값을 저장합니다. 코드는 0부터 시작하는 인덱스 번호를 보상하지 않습니다.

  12. 디버그 세션을 종료하려면 중지를 선택합니다.

  13. 잠시 시간을 내어 문제를 해결하는 방법을 고려하세요.

    이 문제는 사용자에게 0에서 4 사이의 값을 입력하라는 메시지를 표시하여 사용자 인터페이스에서 수정할 수 있습니다. 입력한 값에서 1을 빼서 코드에서 수정할 수도 있습니다. 일반적으로 목표는 명확하고 사용자가 쉽게 따라갈 수 있는 사용자 인터페이스를 만드는 것입니다. 이 경우 다음과 같이 코드를 업데이트하는 것이 더 좋을 수 있습니다.

    Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex - 1)}");
    

    업데이트된 코드를 실행하면 다음 출력이 생성됩니다.

    애플리케이션 논리를 업데이트한 후의 출력을 보여 주는 스크린샷

  14. 제안된 방법을 사용하여 코드를 업데이트한 다음 Program.cs 파일을 저장합니다.

  15. 중단점을 지우고, 디버거에서 애플리케이션을 다시 실행하고, 의도한 결과가 터미널에 표시되는지 확인합니다.

    방금 변수 상태를 사용하여 논리 문제를 식별하고 해결했습니다. 잘했습니다.

조사식 모니터링

WATCH 섹션을 사용하여 하나 이상의 변수를 기반으로 하는 식을 모니터링할 수 있습니다.

데이터 집합에서 숫자 계산을 수행하는 애플리케이션을 작업한다고 가정해 보겠습니다. 두 숫자 변수 간의 비율이 5보다 크면 코드가 신뢰할 수 없는 결과를 생성한다고 생각합니다. WATCH 섹션을 사용하여 계산 비율을 모니터링할 수 있습니다.

  1. 다음 코드로 Program.cs 파일을 업데이트합니다.

    bool exit = false;
    var rand = new Random();
    int num1 = 5;
    int num2 = 5;
    
    do
    {
        num1 = rand.Next(1, 11);
        num2 = num1 + rand.Next(1, 51);
    
    } while (exit == false);
    
  2. Program.cs 파일을 저장합니다.

  3. 최종 코드 줄에 중단점을 설정합니다.

  4. 다음 WATCH 식을 설정합니다.

    num2 / num1 > 5
    
  5. 실행 및 디버그 보기에서 디버깅 시작을 선택합니다.

  6. VARIABLES 및 WATCH 섹션에 표시되는 값을 확인합니다.

  7. WATCH 식이 로 계산될 때까지 true을 선택합니다.

    첫 번째 반복에서 WATCH 식이 true로 평가되었다면, 계속을 몇 번 더 선택하거나, true이 두 번째로 표시될 때까지 선택하십시오.

  8. WATCH 섹션을 사용하는 방법을 잠시 고려해 보세요.

    이 시나리오에서는 두 숫자 변수 간의 비율이 5보다 클 때 코드가 신뢰할 수 없는 결과를 생성한다고 결정했습니다. WATCH 섹션에서 이 조건을 나타내는 식을 생성했습니다. 이제 WATCH 섹션을 사용하여 해당 조건을 추적할 수 있습니다.

VARIABLES 섹션의 변수에 할당된 값 수정

프로그래밍 방식 조건을 수동으로 만들려는 경우가 있을 수 있습니다. 실행 및 디버그 뷰의 VARIABLES 섹션을 사용하면 런타임에 변수의 상태를 변경하여 이 작업을 수행할 수 있습니다.

  1. 실행 중인 코드를 검토하는 데 1분 정도 걸릴 수 있습니다.

    코드가 절대 do 루프에서 빠져나오지 않음을 유념하세요. 왜냐하면 exittrue이 되지 않기 때문입니다. 실제 애플리케이션에서 변경해야 하는 프로그래밍 방식 조건은 아니지만 기능을 보여 줍니다.

  2. VARIABLES 섹션에서 마우스 오른쪽 단추를 클릭한 exit [bool]다음 값 설정을 선택합니다.

    VARIABLES 섹션을 사용하면 런타임에 변수에 할당된 값을 변경할 수 있습니다. 이는 코드가 특정 조건에 어떻게 반응하는지 확인하려는 경우에 유용할 수 있습니다.

  3. exit의 값을 true로 설정하려면 true 입력한 후 Enter 키를 누르십시오.

    이 경우 exit 값을 true로 변경하면 while 문이 실행될 때 애플리케이션이 닫힙니다.

  4. 를 선택합니다 계속.

  5. 디버그 콘솔 패널에 프로그램이 종료되었음을 알리는 메시지가 표시됩니다.

축하합니다! 실행 및 디버그 보기의 변수 및 조사식 섹션을 성공적으로 사용했습니다.

요약

이 단원에서 기억해야 하는 몇 가지 중요한 사항은 다음과 같습니다.

  • RUN 및 DEBUG 뷰의 VARIABLES 섹션을 사용하여 변수 상태를 모니터링합니다.
  • RUN 및 DEBUG 뷰의 WATCH 섹션을 사용하여 시간 또는 다른 메서드 간에 식을 추적합니다.
  • 실행 및 디버그 보기의 CALL STACK 섹션을 사용하여 예외 또는 WATCH 식의 원본 위치를 찾습니다.
  • VARIABLES 섹션을 사용하여 런타임에 변수의 할당된 값을 변경합니다.