Exerciții - Monitorizarea variabilelor și fluxului de execuție

Finalizat

Vizualizarea RULARE ȘI DEPANARE le oferă dezvoltatorilor o modalitate simplă de a monitoriza variabilele și expresiile, de a observa fluxul de execuție și de a gestiona punctele de întrerupere în timpul procesului de depanare.

Examinați secțiunile vizualizării Rulare și Depanare

Fiecare secțiune a vizualizării RUN AND DEBUG oferă capacități unice. Utilizarea unei combinații a acestor secțiuni în timpul procesului de depanare este adesea utilă.

SECȚIUNEA VARIABILE

Starea variabilei de monitorizare este un aspect important al depanării codului. Modificările neașteptate din starea variabilelor vă vor ajuta adesea să identificați erorile logice din cod.

Secțiunea VARIABLES organizează variabilele după domeniu. Domeniul Locals afișează variabilele din domeniul curent (metoda curentă).

Notă

Secțiunea de instrucțiuni de nivel superior a unei aplicații consolă este considerată propria metodă. O metodă denumită Main.

Puteți să desfășurați (să extindeți) domeniile afișate selectând săgeata din partea stângă a numelui domeniului. De asemenea, puteți să desfășurați variabile și obiecte. Următoarea captură de ecran arată matricea numbers nefoldată sub Locals domeniu.

Captură de ecran afișând o variabilă nefoldată în secțiunea Variabile din vizualizarea Rulare și depanare.

De asemenea, este posibil să modificați valoarea unei variabile la momentul rulării utilizând secțiunea VARIABLES. Puteți să faceți dublu clic pe numele variabilei, apoi să introduceți o valoare nouă.

SecțiuneA SUPRAVEGHERE

Ce se întâmplă dacă doriți să urmăriți o stare variabilă în timp sau prin metode diferite? Poate fi plictisitor să căutați variabila de fiecare dată. Aici vine la îndemână secțiunea WATCH.

Puteți selecta butonul Adăugare expresie (apare ca semn plus: +) pentru a introduce un nume de variabilă sau o expresie de urmărit. Ca alternativă, puteți să faceți clic dreapta pe o variabilă în secțiunea VARIABILE și să selectați Add to watch.

Toate expresiile din secțiunea WATCH vor fi actualizate automat pe măsură ce rulează codul.

SECȚIUNEA CALL STACK

De fiecare dată când codul introduce o metodă dintr-o altă metodă, un strat de apel este adăugat la stiva de apeluri a aplicației. Atunci când aplicația devine complexă și aveți o listă lungă de metode apelate de alte metode, stiva de apeluri reprezintă sfârșitul apelurilor de metodă.

Secțiunea CALL STACK este utilă atunci când încercați să găsiți locația sursă pentru o excepție sau o expresie WATCH. Dacă aplicația dvs. generează o excepție neașteptată, veți vedea adesea un mesaj în consolă care seamănă cu următorul:

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

Grupul de linii indentate de at Program ... sub mesajul de eroare se numește urmărire stivă. Trasarea stivei listează numele și originea fiecărei metode apelate care a condus la excepție. Totuși, informațiile pot fi puțin dificil de descifrat, deoarece pot include și informații din modulul runtime .NET. În acest exemplu, trasarea stivei este destul de curată și puteți vedea că s-a produs o excepție într-o metodă denumită WriteMessage. Stiva provine dintr-o metodă denumită Main, care este secțiunea de instrucțiuni de nivel superior a aplicației consolă.

Secțiunea CALL STACK vă poate ajuta să evitați dificultatea descifrării unei trasări de stivă care este aglomerată cu informațiile runtime .NET. Acesta filtrează informațiile nedorite pentru a vă arăta doar metodele relevante din propriul cod în mod implicit. Puteți derula manual stiva de apeluri pentru a afla unde provine excepția.

SECȚIUNEA BREAKPOINTS

Secțiunea BREAKPOINTS afișează setările curente ale punctului de întrerupere și poate fi utilizată pentru a activa sau a dezactiva anumite puncte de întrerupere în timpul unei sesiuni de depanare.

Configurați aplicația și lansați configurația

Atunci când lucrați la o aplicație consolă care citește intrările utilizatorului, probabil că va trebui să actualizați fișierul de configurare.

  1. Actualizați codul din fișierul Program.cs după cum urmează:

    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. Luați un minut pentru a revizui codul.

    Observați următoarele:

    • Codul specifică o matrice întreagă care conține cinci numere.
    • Codul afișează ieșirea în consolă.
    • Codul îi solicită utilizatorului să introducă un număr n de element de pornire pe care îl utilizează pentru a însuma elementele n matrice prin 5.
    • Codul calculează suma dintr-o metodă, afișează rezultatele în consolă, apoi se întrerupe.

    Notă

    Panoul CONSOLĂ DEBUG nu acceptă intrarea utilizatorului din consolă.

  3. În meniul Fișier Visual Studio Code, selectați Salvare.

  4. În meniul Executare , selectați Eliminare toate punctele de întrerupere.

    Acest lucru elimină toate punctele de întrerupere rămase din exercițiul anterior.

  5. În vizualizarea RULARE ȘI DEPANARE, selectați Pornire depanare.

  6. Observați că apare o eroare atunci când se execută linia de Console.Clear(); cod.

  7. Pe bara de instrumente Depanare, selectați Oprire.

  8. Comutați la vizualizarea EXPLORER, apoi deschideți fișierul launch.json în Editor.

  9. Actualizați valoarea atributului console după cum urmează:

    "console":"integratedTerminal",
    
  10. În meniul Fișier cod Visual Studio, selectați Salvare, apoi închideți fișierul launch.json.

Revizuiți rezultatele aplicației și identificați problemele

Revizuirea rezultatului aplicației poate dezvălui probleme logice pe care le-ați omis atunci când scrieți codul.

  1. Comutați înapoi la vizualizarea RULARE ȘI DEPANARE.

  2. În vizualizarea RULARE ȘI DEPANARE, selectați Pornire depanare.

    Mesajele afișate în panoul CONSOLĂ DEBUG afișează atașarea de depanare la Debug101.dll aplicație.

  3. Observați că nu se afișează niciun mesaj de eroare.

    Modificarea valorii atributului console din internalConsole la integratedTerminal în fișierul de configurare de lansare a remediat eroarea consolei. Dar acum trebuie să găsiți consola care conține rezultatul.

  4. În zona Panouri de sub Editor, comutați de la panoul CONSOLĂ DEBUG la panoul TERMINAL.

  5. Observați că executarea codului a fost pusă în pauză la mesaj, solicitând utilizatorului să introducă o valoare pentru n.

    Ieșirea de pe panoul TERMINAL ar trebui să arate astfel:

    
    The 'numbers' array contains: { 1 2 3 4 5 }
    
    To sum values 'n' through 5, enter a value for 'n':
    
  6. În linia de comandă TERMINAL, introduceți 3

  7. Revizuiți ieșirea din aplicație.

    Ieșirea de pe panoul TERMINAL ar trebui să arate astfel:

    
    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. Luați un minut pentru a lua în considerare valoarea sum raportată și valorile elementelor matrice de la 3 la 5 afișate în partea de sus a consolei.

    Mesajul spune: The sum of numbers 3 through 5 is: 9. Cu toate acestea, elementele matrice de la 3 la 5 sunt 3, 4și 5. Suma raportată nu ar trebui să fie 12?

    Puteți utiliza secțiunea VARIABLES din vizualizarea RULARE ȘI DEPANARE pentru a investiga problema.

Stare variabilă monitor

În unele cazuri, monitorizarea stării variabilei este suficientă pentru a identifica problema logică din aplicația dvs.

  1. Setați un punct de întrerupere în următoarea linie de cod:

    Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex)}");
    
  2. În vizualizarea RULARE ȘI DEPANARE, selectați Pornire depanare.

  3. Comutați de la panoul CONSOLĂ DEBUG la panoul TERMINAL.

  4. În linia de comandă TERMINAL, introduceți 3

    Executarea codului se va pune în pauză la punctul de întrerupere.

  5. Citiți un minut pentru a revizui secțiunea VARIABLES a vizualizării RULARE ȘI DEPANARE.

    Observați că startIndex a fost atribuită valoarea pe care ați introdus-o, care este 3.

  6. Selectați Pas cu pas.

  7. Observați că se actualizează secțiunile VARIABLES și CALL STACK.

    Secțiunea CALL STACK arată că executarea codului s-a mutat în SumValues metodă.

    Secțiunea VARIABILE, care listează variabilele locale, afișează valoarea numărului întreg n. Parametrul n metodei îi este atribuită valoarea din argumentul startIndexde apel al metodei . În acest caz, modificarea numelor variabilelor face clar că valoarea a fost transmisă, nu un indicator de referință.

    Notă

    În acest caz, puteți vedea majoritatea codului în Editor, astfel încât este posibil să nu aveți nevoie de secțiunea CALL STACK, dar atunci când lucrați la aplicații mai mari cu apeluri de metodă profund imbricate și interconectate, calea de execuție afișată în secțiunea CALL STACK poate fi extrem de utilă.

  8. Continuați selectarea Pas cu pas până când valoarea atribuită sum nu mai 0este .

  9. Citiți un minut pentru a revizui informațiile afișate în secțiunea VARIABILE.

    Ar trebui să vedeți următoarele:

    Captură de ecran afișând secțiunea Variabile din vizualizarea Rulare și depanare.

    Observați că valoarea atribuită sum a fost de la .04

  10. Pentru a extinde matricea numbers , selectați numere [int[]].

    Captură de ecran afișând elemente matrice extinse în secțiunea Variabile din vizualizarea Rulare și depanare.

  11. Rețineți că elementele matrice sunt accesate utilizând numere index bazate pe zero.

    În acest caz, eroarea logică este o discrepanță între instrucțiunile din interfața de utilizator și codul subiacent. Interfața utilizator se referă la elementele matrice 1-5. Cu toate acestea, codul utilizează valoarea introdusă de utilizator pentru a accesa elementele matrice bazate pe zero. Elementul matrice care are un index al 3 stochează valoarea .4 Codul nu compensează numerele index bazate pe zero.

  12. Pentru a termina sesiunea de depanare, selectați Oprire.

  13. Luați un minut pentru a lua în considerare modul în care puteți remedia problema.

    Această problemă poate fi corectată în interfața de utilizator solicitând utilizatorului să introducă o valoare între 0 și 4. De asemenea, poate fi corectată în cod prin scăderea 1 din valoarea introdusă. În general vorbind, obiectivul dvs. ar trebui să fie un obiectiv clar și ușor de urmărit interfața de utilizator. În acest caz, ar putea fi mai bine să actualizați codul după cum urmează:

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

    Rularea codului actualizat va produce următoarea ieșire:

    Captură de ecran care afișează rezultatul după actualizarea logicii aplicației.

  14. Actualizați codul utilizând abordarea sugerată, apoi salvați fișierul Program.cs.

  15. Goliți punctul de întrerupere, rulați din nou aplicația în depanator și verificați dacă rezultatul intenționat este afișat în TERMINAL.

    Tocmai ați utilizat starea variabilei pentru a identifica și a remedia o problemă logică! O treabă extraordinară.

Monitorizarea expresiilor de supraveghere

Secțiunea WATCH poate fi utilizată pentru a monitoriza expresiile bazate pe una sau mai multe variabile.

Să presupunem că lucrați la o aplicație care efectuează calcule numerice pentru un set de date. Credeți că codul dvs. produce rezultate de încredere atunci când raportul dintre două variabile numerice este mai mare decât 5. Puteți utiliza secțiunea WATCH pentru a monitoriza raportul calculat.

  1. Actualizați fișierul Program.cs cu următorul cod:

    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. Salvați fișierul Program.cs.

  3. Setați un punct de întrerupere pentru linia finală de cod.

  4. Setați următoarea expresie WATCH:

    num2 / num1 > 5
    
  5. În vizualizarea RULARE ȘI DEPANARE, selectați Pornire depanare.

  6. Observați valorile afișate în secțiunile VARIABLES și WATCH.

  7. Selectați Continuare până când vedeți expresia WATCH evaluată la true.

    Dacă expresia WATCH evaluată la true prima iterație, selectați Continuați de mai multe ori sau până când vedeți true a doua oară.

  8. Luați un minut pentru a lua în considerare modul în care se utilizează secțiunea WATCH.

    În acest scenariu, ați stabilit că codul dvs. produce rezultate care nu sunt de bună voie atunci când raportul dintre două variabile numerice este mai mare decât 5. Ați construit o expresie în secțiunea WATCH care reprezintă această condiție. Acum puteți utiliza secțiunea WATCH pentru a urmări această condiție.

Modificarea valorii atribuite unei variabile în secțiunea VARIABILE

Pot exista momente când doriți să creați manual o condiție programatică. Secțiunea VARIABLES din vizualizarea RUN AND DEBUG vă permite să faceți acest lucru modificând starea unei variabile la momentul rulării.

  1. Citiți un minut pentru a revizui codul pe care îl rulați.

    Observați că codul nu va ieși niciodată din do buclă, deoarece exit nu va fi trueniciodată . Aceasta nu este o condiție programatică pe care trebuie să o modificați într-o aplicație reală, dar demonstrează capacitatea.

  2. În secțiunea VARIABILE, faceți clic dreapta pe exit [bool], apoi selectați Setare valoare.

    Secțiunea VARIABLES vă permite să modificați valoarea atribuită unei variabile la momentul rulării. Acest lucru poate fi util atunci când doriți să vedeți cum reacționează codul la o anumită condiție.

  3. Pentru a seta valoarea la exittrue, tastați true , apoi apăsați pe Enter.

    În acest caz, modificarea valorii la exittrue va determina închiderea aplicației atunci când se execută instrucțiunea while .

  4. Selectați Continuați.

  5. Observați că panoul CONSOLĂ DEBUG afișează un mesaj care vă informează că programul a ieșit.

Felicitări! Ați utilizat cu succes secțiunile VARIABLES și WATCH din vizualizarea RULARE ȘI DEPANARE.

Recapitulare

Iată câteva lucruri importante de reținut din această unitate:

  • Monitorizați starea variabilei utilizând secțiunea VARIABLES a vizualizării RUN AND DEBUG.
  • Urmăriți o expresie în timp sau diferite metode utilizând secțiunea WATCH a vizualizării RULARE ȘI DEPANARE.
  • Utilizați secțiunea CALL STACK din vizualizarea RUN AND DEBUG pentru a găsi locația sursă a unei excepții sau a unei expresii WATCH.
  • Utilizați secțiunea VARIABLES pentru a modifica valoarea atribuită a unei variabile la momentul rulării.