Exerciții - Depanare cu Visual Studio

Finalizat

Este timpul să vă puneți în practică cunoștințele nou dobândite. Este prima ta zi la locul de muncă, și doriți să vă puneți abilitățile de depanare .NET pentru a lucra prin remedierea unei erori în produsul firmă de depanare, un calculator Fibonacci.

Creați un exemplu de proiect .NET pentru depanare

Pentru a configura Visual Studio pentru depanare .NET, avem nevoie mai întâi de un proiect .NET. Visual Studio oferă numeroase șabloane starter care simplifică crearea unui proiect nou.

  1. În Visual Studio, selectați Fișier>Nou>Project .

  2. În caseta de dialog Creați un nou proiect, selectați aplicație consolă și alegeți Următorul.

  3. Denumiți proiectul DotNetDebugging și alegeți locația în care doriți să salvați. Lăsați celelalte valori la valorile lor implicite, apoi selectați Următorul.

  4. Selectați Creare pe ecranul final.

Visual Studio creează proiectul Consolă pentru noi utilizând șablonul pe care l-am selectat. După ce se încarcă proiectul, deschideți Program.cs selectându-l.

Adăugați logica programului Fibonacci

Proiectul nostru curent scrie un mesaj "Hello World" pe consolă, care nu ne oferă prea multe de depanare. În schimb, să utilizăm un program .NET scurt pentru a calcula numărulN al secvenței Fibonacci.

Secvența Fibonacci este o suită de numere care începe cu numerele 0 și 1, fiecare dintre următoarele fiind suma celor două anterioare. Secvența continuă așa cum se arată aici:

0, 1, 1, 2, 3, 5, 8, 13, 21...

Următorul cod eșantion conține o eroare, așadar, să utilizăm instrumentele de depanare ale Visual Studio pentru a diagnostica și a rezolva problema.

  1. Înlocuiți conținutul Program.cs cu următorul cod:
int result = Fibonacci(5);
Console.WriteLine(result);

static int Fibonacci(int n)
{
    Console.WriteLine("The output is: ");
    int n1 = 0;
    int n2 = 1;
    int sum;

    for (int i = 2; i < n; i++)
    {
        sum = n1 + n2;
        n1 = n2;
        n2 = sum;
    }

    return n == 0 ? n1 : n2;
}

Notă

Acest cod conține o eroare pe care o depanăm mai târziu în acest modul. Nu recomandăm să îl utilizați în nicio aplicație Fibonacci critică pentru misiune până când nu remediem eroarea respectivă.

  1. Salvați fișierul cu Ctrl+S pentru Windows și Linux. Selectați Cmd+S pentru Mac.

  2. Să vedem cum funcționează codul actualizat înainte de a-l depana. Rulați programul apăsând butonul verde Start din bara de comenzi Visual Studio.

  3. La sfârșitul ieșirii consolei de depanare, puteți vedea că programul scrie 3 pe consolă, apoi iese cu codul 0. De obicei, un cod de ieșire de program de 0 indică faptul că programul a rulat și a ieșit fără a avea căderi. Totuși, există o diferență între cădere și returnarea valorii corecte.

fereastră Terminal cu ieșire de program modificată.

În acest caz, am solicitat programului să calculeze a cincea valoare a secvenței Fibonacci:

0, 1, 1, 2, 3, 5, 8, 13, 21...

A cincea valoare din această listă este 5, dar programul nostru a returnat 3. Să utilizăm depanatorul pentru a diagnostica și a remedia această eroare.

Utilizarea punctelor de întrerupere și a executării pas cu pas

  1. Adăugați un punct de întrerupere făcând clic pe marginea din stânga la linia 1 pe int result = Fibonacci(5);.

  2. Începeți să depanați din nou. Programul începe să se execute. Se întrerupe (întrerupe execuția) pe linia 1 din cauza punctului de întrerupere pe care l-ați setat. Utilizați controalele de depanare pentru a intra în funcția Fibonacci().

    Captură de ecran a butonului Pas cu pas.

Verificați starea variabilelor

Acum, aveți nevoie de un timp pentru a inspecta valorile variabilelor diferite, utilizând fereastra Locals.

Captură de ecran a panoului Locals.

  • Care este valoarea afișată pentru parametrul n?
  • La începutul executării funcției, care sunt valorile pentru variabilele locale n1, n2și sum?
  1. În continuare, avansăm în for buclă utilizând controlul de depanare Pas peste .

    Captură de ecran a butonului Pas peste.

  2. Continuați avansarea până când ajungeți la prima linie din interiorul buclei for . Linia care citește:

    sum = n1 + n2;
    

Notă

Este posibil să observați că trecerea prin for(...) {} linie necesită mai mulți pași în comenzi. Această situație apare deoarece există mai multe instrucțiuni în această linie. Atunci când treceți la următoarea instrucțiune din cod. De obicei, există o instrucțiune pe linie. Dacă nu este cazul, aveți nevoie de mai mulți pași pentru a trece la linia următoare.

Gândiți-vă la cod

O parte importantă a depanării este să opriți și să ghiciți câteva informații despre ceea ce credeți că porțiuni ale codului (ambele funcții și blocuri, cum ar fi buclele) încearcă să facă. Este în regulă dacă nu sunteți sigur, aceasta face parte din procesul de depanare. Dar faptul că sunteți implicat în mod activ în procesul de depanare vă ajută să găsiți erorile mult mai rapid.

Înainte de a explora mai departe, să ne amintim că secvența Fibonacci este o serie de numere care începe cu numerele 0 și 1, cu fiecare alt număr fiind suma celor două anterioare.

Aceasta înseamnă că:

Fibonacci(0) = 0
Fibonacci(1) = 1
Fibonacci(2) = 1 (0 + 1)
Fibonacci(3) = 2 (1 + 1)
Fibonacci(4) = 3 (1 + 2)
Fibonacci(5) = 5 (2 + 3)

Înțelegerea acestei definiții și a privi această buclă for, putem deduce că:

  1. Bucla contorizează de la 2 la n (numărul de secvență Fibonacci pe care îl căutăm).
  2. Dacă n este mai mic decât 2, bucla nu rulează niciodată. Instrucțiunea return de la sfârșitul funcției returnează 0 dacă n este 0 și 1 dacă n este 1 sau 2. Aceste valori sunt valorile zero, prima și a doua din seria Fibonacci, după definiție.
  3. Cazul mai interesant este atunci când n este mai mare decât 2. În aceste cazuri, valoarea curentă este definită ca suma celor două valori anterioare. Așadar, pentru această buclă, n1 și n2 sunt cele două valori anterioare, iar sum este valoarea pentru iterația curentă. Din cauza acestei logici, de fiecare dată când ne dăm seama de suma celor două valori anterioare și setați-o la sum, ne n1 actualizăm și n2 valorile.

Bine, nu trebuie să reconsiderăm asta. Putem să ne aplecăm puțin pe depanamentul nostru. Dar merită să se gândească la cod pentru a vedea dacă face ceea ce ne așteptăm și să fie mai informat atunci când nu face acest lucru.

Găsiți eroarea cu puncte de întrerupere

Parcurgerea codului poate fi utilă, dar plictisitoare. Mai ales atunci când lucrați cu bucle sau cu alt cod care este apelat în mod repetat. În loc să trecem prin buclă peste și peste, putem seta un nou punct de întrerupere pe prima linie a buclei.

Este important să fii strategic în legătură cu locul în care ne punem punctele de întrerupere. Ne interesează în special valoarea sum, deoarece reprezintă valoarea maximă Fibonacci curentă. Deci, să punem punctul nostru de pauză pe linie dupăsum ce este stabilit.

  1. Adăugați un al doilea punct de întrerupere în linia 14.

    Captură de ecran afișând un al doilea punct de întrerupere setat.

    Notă

    Dacă observați că continuați să rulați codul și apoi să parcurgeți o linie sau două, puteți actualiza cu ușurință punctele de întrerupere pentru a fi mai eficiente.

  2. Acum, că avem un punct de întrerupere bun setat în buclă, selectați Continuare în controalele de depanare pentru a avansa până când punctul de întrerupere este atins. Privind variabilele noastre locale, vedem următoarele linii:

    n [int]: 5
    n1 [int]: 0
    n2 [int]: 1
    sum [int]: 1
    i [int]: 2
    

    Aceste linii par corecte. Prima dată prin buclă, sum celor două valori anterioare este 1. În loc să parcurgem linia cu linie, putem profita de punctele noastre de întrerupere pentru a trece la următoarea dată prin buclă.

  3. Selectați Continuare pentru a continua fluxul de program până când se atinge următorul punct de întrerupere, care va fi la următoarea trecere prin buclă.

    Notă

    Nu fiți prea îngrijorat că ați omitet eroarea atunci când utilizați Continuați. Ar trebui să vă așteptați să depanați codul de mai multe ori pentru a găsi problema. Adesea este mai rapid să treceți prin el de câteva ori, spre deosebire de a fi prea precaut atunci când parcurgeți.

    De data aceasta, vedem următoarele valori:

    n [int]: 5
    n1 [int]: 1
    n2 [int]: 1
    sum [int]: 2
    i [int]: 3
    

    Aceste valori încă au sens? Se pare că o fac. Pentru al treilea număr Fibonacci, ne așteptăm să vedem sum egal cu 2 și este.

  4. Selectați Continuați pentru a-l repeta.

    n [int]: 5
    n1 [int]: 1
    n2 [int]: 2
    sum [int]: 3
    i [int]: 4
    

    Rezultatul este corect. Este de așteptat ca a patra valoare din serie să fie 3.

  5. În acest moment, poate începeți să vă întrebați dacă codul a fost corect tot timpul și v-ați imaginat eroarea! Să păstrăm acest lucru pentru ultima dată prin buclă. Selectați Continuați încă o dată.

    Programul a terminat rularea și ieșirea este 3! Rezultatul nostru este incorect.

    Acum știm că codul rulează corect prin buclă până când i egal cu 4, dar apoi iese din înainte de a calcula valoarea finală. Am îngustat unde se află bug-ul.

  6. Să stabilim încă un punct de întrerupere în linia 18, care citește:

    return n == 0 ? n1 : n2;
    

    Acest punct de întrerupere ne permite să inspectăm starea programului înainte de ieșirea funcției. Am învățat deja tot ce ne putem aștepta de la punctele noastre de întrerupere anterioare pe liniile 1 și 13, astfel încât să le putem goli.

  7. Eliminați punctele noastre de întrerupere anterioare pe liniile 1 și 13. Bifați punctele de întrerupere de pe margine de lângă numerele de linie sau debifați casetele de selectare punct de întrerupere pentru liniile 1 și 13 din panoul puncte de întrerupere din partea din stânga jos.

    Captură de ecran afișând punctele de întrerupere listate în panoul puncte de întrerupere.

    Acum, că am înțeles mai bine ce se întâmplă și a stabilit un punct de întrerupere concepute pentru a prinde programul nostru în actul de comportare greșită. Acum ar trebui să putem prinde această eroare!

  8. Porniți depanatorul ultima dată.

    n [int]: 5
    n1 [int]: 2
    n2 [int]: 3
    sum [int]: 3
    

    Am cerut în mod specific Pentru Fibonacci(5) și am luat Fibonacci(4), care este incorect. Această funcție returnează n2și fiecare iterație în buclă calculează valoarea sum și setează n2 egală cu sum.

    Pe baza acestor informații și a rularii noastre anterioare de depanare, putem vedea că bucla a ieșit atunci când i avea 4, nu 5.

    Să ne uităm puțin mai aproape de afirmația noastră for .

    for (int i = 2; i < n; i++)
    

    Această logică face ca programul să se închidă imediat ce partea de sus a buclei vede i egală cu n. Aceasta înseamnă că codul de buclă nu rulează pentru cazul în care i este negal cu . Se pare că ceea ce am vrut a fost de a rula până la i <= n, în schimb:

    for (int i = 2; i <= n; i++)
    

    Prin urmare, cu această modificare, programul actualizat ar trebui să arate astfel:

    int result = Fibonacci(5);
    Console.WriteLine(result);
    
    static int Fibonacci(int n)
    {
        Console.WriteLine("The output is: ");
        int n1 = 0;
        int n2 = 1;
        int sum;
    
        for (int i = 2; i <= n; i++)
        {
            sum = n1 + n2;
            n1 = n2;
            n2 = sum;
        }
    
        return n == 0 ? n1 : n2;
    }
    
  9. Opriți sesiunea de depanare dacă nu ați făcut-o deja.

  10. Efectuați modificarea anterioară la linia 11 și lăsați punctul de întrerupere în linia 18.

  11. Reporniți depanatorul. De data aceasta, când atingem punctul de întrerupere pe linia 18, vedem următoarele valori:

    n [int]: 5
    n1 [int]: 3
    n2 [int]: 5
    sum [int]: 5
    

    Hei! Se pare că l-am prins! Mare de muncă, ai salvat ziua pentru Fibonacci, Inc.!

  12. Selectați Continuare doar pentru a vă asigura că programul returnează valoarea corectă.

    5
    The program '[105260] DotNetDebugging.dll' has exited with code 0 (0x0).
    

    Și aceasta returnează rezultatul corect.

Ai făcut-o! Ați depanat un cod pe care nu l-ați scris utilizând depanatorul .NET din Visual Studio.

În următoarea unitate, veți afla cum să faceți codul pe care îl scrieți mai ușor de depanat, utilizând caracteristicile de înregistrare în jurnal și urmărire încorporate în .NET.