Una dintre cele mai importante facilitati pe care o ofera Visual Studio este cea de Debug. Ce inseamna asta? A face Debug inseamna a analiza ce se intampla, la executie, in interiorul aplicatiei asupra careia facem Debug. Aceasta operatie are ca scop gasirea si repararea erorilor (bugs) dintr-o aplicatie. Aceasta operatie se face cu ajutorul uor instrumente speciale, numite debuggers. Cu ajutorul acestor unelte se poate vedea la runtime ce se intampla in timpul executiei aplicatiei asupra careia se face operatia de debug. In cazul Visual Studio uneltele sunt incluse in pachetul Visual Studio, userul netrebuind sa instaleze separat nimic.
Exista, din cate stiu eu, doua metode de a porni o operatie de debug: prin apasarea butonului Start Debuging din toolbar-ul Standard (sau comanda din meniul Debug) sau, metoda a doua, prin atasarea de o aplicatie care ruleaza, folosind comanda Attach to Process, din acelasi meniu. Vezi in imaginile urmatoare cele doua optiuni.
O captura de ecran pentru butonul debug:
si o captura de ecran pentru meniul Debug:
O sa explic cum se folosesc fiecare dintre aceste optiuni. O sa scriu un program scurt, caruia o sa ii fac Debug. Acest program, simplu, care contine, deocamdata, numai metoda Main, este urmatorul:
class Program { static void Main(string[] args) { Console.Write("Name: "); string str = Console.ReadLine(); for (int i = 0; i < 5; i++) { Console.WriteLine(i + ". Hello " + str); } } }
Tot ce face acest program e sa citeasca de la tastatura un string si sa afiseze de 5 ori mesajul Hello plus stringul citit de la tastatura, iar in fata fiecarui rand afisat apare si numarul itinetatiei. La executie vedem ceva de genul:
Ady 0. Hello Ady 1. Hello Ady 2. Hello Ady 3. Hello Ady 4. Hello Ady
Pentru a Opri executia programului la un moment dat, avem nevoie de un BreakPoint. Un BreakPoint este un punct in cod unde debuggerul opreste temporar executia programului si permite examinarea starii lui in momentul respectiv. Pentru a stabili un astfel de punct (loc) ceea ce trebuie facut e sa clickam in editor, in Visual Studio, in marginea stanga a ferestrei in care editam codul, in dreptul liniei unde vrem sa stabilim acel BreakPoint. In programul exemplu eu am stabilit 2 astfel de locuri:
Se observa ca linia unde executia programului va fi intrerupta este colorata diferit.
Apasam butonul Debug (sau tasta F5) pentru a porni operatia de Debug:
In imaginea anterioara se observa cum linia unde a setat primul breakPoint este evidentiata diferit, cu galben. Asta inseamna ca programul este oprit in puctul respectiv. Pentru a continua, e nevoie sa ii spunem Debugger-ului sa mearga mai departe – apasam tasta F5 pentru a continua executia programului, tasta F10 pentru a continua executia prin executarea urmatoareil linii de program (numai o linie) sau F11 pentru a continua executia prin salt in interiorul functiei care se executa in linia in care am oprit – numai in cazul in care suntem intr-o linie in care se executa cod definit intr-o alta metoda – nu e cazul actual.
Eu apas acum F5. Programul isi continua executia si eu trebuie sa introduc un nume. Scriu in fereastra consola un nume: “Ady” si apas enter. Programul isi continua executia pana la urmatorul breakPoint unde debugger-ul preia controlul. In fereastra codului, in momentul in care sunt in Debug Mode am acces la memoria aplicatiei, in sensul ca pot vedea starea obiectelor care imi compun aplicatia. Daca pozitionez cursorul mouse-ului deasupra numelui unui obiect, Visual Studio imi va afisa valoarea respectivei valori asa cum este ea in momentul respectiv in memorie. Pozitionand cursorul mouse-ului deasupra variabilel str, voi vedea valoarea ei, respectiv numele introdus de mine in fereastra Consola:
Daca versiunea de Visual Studio este Profesional, valoarea variabilelor se poate medifica in fereastra debug, la runtime. Insa despre asta intr-un alt articol. Continui executia programului, de data asta linie cu linie, apasand tasta F10. Observ ca la fiecare apasare a tastei respective executia avanseaza, iar linia care se executa in momentul curent este evidentiata. Acum urmaresc valorile variabilei i in interioru ciclului for:
Continui asa, pana cand programul isi termina executia.
A doua metoda de a intra in modul debug este prin atasarea la un proces care ruleaza. Pornim aplicatia (apasam Ctrl+ F5, adica start without debugging, sau executam din folderul \HelloWorld\HelloWorld\bin\Debug\HelloWorld.exe aplicatia. In momentul in care aplicatia a ajuns in puctul in care ne cere sa introducem numele, revenim la visual studio si din meniul Debug apelam Attach to process:
In acest moment avem o fereastra care contine numele proceselor care sunt executate in calculator:
Selectam procesul care are numele identic cu numele aplicatiei noastre si apasam butonul Attach. Din acest moment procesul de debug continua ca si in primul caz, descris mai sus. Programul opreste la ficare BreakPoint, poate fi executat linie cu linie, se pot modifica valorile variabilelor (Pro) etc.
In momentul in care Visual studio este in mod Debug, click cu butonul din dreapta deschide un meniu care are cateva comenzi importante, dintre care vreau sa evidentiez doua: Run To Cursor si Set next Statement:
Ce sunt cele doua comenzi? Prima, Run To Cursor este utila in cazul in care vrem sa continuam executia programului pana intr-un anumit punct, punct in care sa fie iarasi intrerupta executia. Putem sa punem acolo un breakPoint nou, sau putem sa pozitionam cursorul in editor in locul respectiv si sa apelam comanda Run To Cursor. A doua comanda este Set next Statement. Cu ajutorul acesti comenzi se continua executia programului de la un punct dorit de programator – inainte sau dupa punctul curent. La ce foloseste asta? Pentru a evita o eroare (care trebuie corectata ulterior), pentru a relua executia unui bloc etc.
Acesta este un prim articol despre operatia de debug. Vor mai fi si altle.
Multumesc si astept comentarii, pareri si sugestii.
Bogdan says:
Ca si completare ar fi putea fi adaugat: Add Watch. Aceasta se obtine facand click dreapta pe o variabila pe care se doreste sa fie “supravegheata” pe timpul executiei programului, apoi selectat din menu-ul conextual optiunea “Add Watch”.
O alta optiune ar fi posibilitatea de a schimba valoarea unei variabile “supravegheate” introducand o valoare dorita sau “nedorita” (in cazul in care se urmareste comportamentul programului atunci cand o anumita variabila are valori care ar putea duce la aparitia unui bug).
zeltera says:
Despre tot ce ai zis tu intr-un articol viitor. Tre’ sa scriu si maine despre ceva :)
Multumesc pentru completare.