Debugging - mini tutorial
Last Updated: Aug 27 2013 20:03, Started by
Cy_Cristian
, Aug 27 2013 16:36
·
0
#1
Posted 27 August 2013 - 16:36
Mini articolul de față se vrea a fi o introducere în folosirea debuggerelor. Sper că am atins mai tot ce este necesar pentru un începător. Pentru o folosire eficientă recomand citirea mai in detaliu a manualelor uneltelor folosite precum și exersarea comenzilor.
Tocmai am terminat de scris un cod ce trebuia sa rezolve o anumită cerință/problemă și urmează să-l testăm. Ne apucăm de testat pe ceva cazuri mai mult sau mai puțin inventate. Dar ceva nu merge bine, iar codul (sau cunoștințele) nu permite găsirea imediată a problemei. Trebuie analizat codul, dar fie nu avem răbdare să analizăm cu foaia și creionul in față, fie analiza este destul de complexă. Cert este că au fost alții care s-au gândit că niște unelte de analiză a execuției "codului" ar fi mai mult decât benefice. Așadar trecem la "puricarea" codului (a se citi cum a apărut termenul de debug). Pentru scrierea codului am folosit o suită (un pachet) de unelte (toolchains) de dezvoltare care vine (sau nu) cu propriul debugger. Anumite suite vin cu un IDE ce integrează mai multe unelte (editor de cod, compilator, link editor, debugger, ...). Vezi acest articol în cazul în care anumiți termeni îți sunt confuzi. Pregătirea pentru debugging. Codul pe care vrem să-l analizăm, trebuie compilat și link-editat cu opțiuni de debug. Opțional - pregătim setul de date necesar reproducerii defectului (fie un fișier, fie direct din cod, script, samd ...). Debugging cu Visual Studio Poziționăm cursorul de editare pe linia la care vrem ca programul să-și întrerupă execuția. Pentru a pune (sau scoate) un breakpoint se apasă F9 sau click dreapta->Breakpoint->Insert Breakpoint. Vezi poza atașată: set_break.png 100.63K 107 downloads Un breakpoint se poate pune doar pe o linie ce conține cel puțin o instrucțiune. Putem merge la punctul următor și anumite execuția programului. În Visual Studio, programul va fi lansat în execuție cu debugger-ul atașat în 2 feluri. - apăsând F5, programul va rula de la început până la primul breakpoint intâlnit în execuția sa. - apăsând F10, programul va începe execuția, însă se va opri imediat în funcția main. Adaugăm fereastra de vizualizare a variabilelor precum și cea de vizualizare a stivei curente a apelurilor de funcții. Aceste ferestre sunt disponibile doar în momentul în care execuția programului a început. debug_windows.png 155.83K 110 downloads Inseram variabilele pe care vrem să le monitorizăm. În cazul de față ele sunt: i, j, j+1, mat[i][j], mat[i][j+1]. În timpul execuției, ecranul vostru va trebui să arate ca mai jos (evident, fiecare își aranjează mobila cum vrea în casă): debug.png 141.75K 77 downloads Am marcat pe poză următoarele: 1 - fereastra de cod 2 - fereastra de variabile care sunt afișate 3 - fereastra cu stiva curentă de apeluri de funcții Am marcat cu ecran roșu locul unde apare problema (codul este luat, mai mult sau mai puțin copy-paste de aici) Taste "magice": - F5 (la fel ca mai sus), rulează programul până la primul breakpoint întâlnit - F10 rulează instrucțiune cu instrucțiune programul. - F11 în cazul în care instrucțiunea curentă este o funcție, debuggerul va intra în funcția respectivă. - ... Debugging cu gdb gdb este o unealtă care face parte din suita de unelte oferite de GNU. Mai toate suitele de unelte care se bazează pe gcc și familia vor avea și gdb livrat. Mai mult, CodeBlocks, Eclipse, BloodShed (proiect mort) au deja gdb-ul integrat. Pentru că nu am la îndemână nici CodeBlocks și nici Eclipse cu C/C++, voi încerca (sper să reușesc măcar parțial) să aduc puțină lumină (acolo unde ea lipsește), în ceea ce privește operarea cu gdb din linie de comandă. Compilăm și link-editam codul g++ -g softpedia.cpp -o softpediaLansăm gdb in executie: gdb softpediaPunem breakpoint la linia la care dorim sau în funcția în care dorim ca programul să-și întrerupă execuția: (gdb) break softpedia.cpp:32 Breakpoint 1 at 0x400aeb: file softpedia.cpp, line 32.- rulăm programul: (gdb) run- după introducerea datelor, programul se va opri la linia la care am pus breakpointul Starting program: ./softpedia Breakpoint 1, main () at softpedia.cpp:32 32 if(mat[i][j]==mat[i][j+1])- putem lista conținutul codului din jurul liniei unde este s-a oprit execuția programului cu comanda list. Alte comenzi utile: - continue (echivalent cu F5 de mai sus) - step - execută următoarea instrucțiune/linie (echivalent cu F10 din Visual Studio) - stepi - echivalent cu F11 din Visual Studio - print - afișează valoare fiecărei variabile din listă (e.g.: print i,j,mat[i][j]) - where - listează stiva curentă de de apeluri. - quit - întrerupe execuția programului și va ieși din gdb Q&A: Problemă: Am executat programul cu F5 (run) dar nu s-a oprit unde am pus breakpointul. Soluție: Linia unde a fost pus breakpointul n-a fost atinsă din diferite motive. Pune breakpointul cu un nivel mai sus (funcție, buclă,..). Verifică din nou datele de intrare. Problemă: Dar mie îmi crapă după 1000000 de bucle, nu am chef sa dau de atâtea ori F5 (sau să scriu continue în gdb). Soluție: Se pot seta condiții în care breakpointurile care pot fi activate. Problemă: Am pus un breakpoint dar acum vrea sa scap de el. Cum fac. Soluție: Est un tânăr aspirant la rolul de programator. Google e mare. Însă pe scurt, în Visual Studio poți să faci asta în 2 moduri. Cu F9 sau din fereastra în care sunt listate toate breakpoint-urile. Cu gdb e la fel de simplu ca și în Visual Studio. Există comanda delete. Trebuie doar să știi pe care anume breakpoint vrei să-l ștergi. Spor la "puricat". |
#3
Posted 27 August 2013 - 16:51
Cy_Cristian, on 27 august 2013 - 16:36, said:
Problemă: Dar mie îmi crapă după 1000000 de bucle, nu am chef sa dau de atâtea ori F5 (sau să scriu continue în gdb). Soluție: Se pot seta condiții în care breakpointurile care pot fi activate. ignore <breakpoint> <count> |
#4
Posted 27 August 2013 - 16:52
Exista si in VS. Fie ai hitcount, fie conditie in functie de variabile.
|
#5
Posted 27 August 2013 - 16:54
[ http://aug.imghost.us/EKer/dsds.jpg - Pentru incarcare in pagina (embed) Click aici ]
|
#6
Posted 27 August 2013 - 16:57
Mi-a plăcut cum ai sintentizat partea referitoare la gdb .
Chiar dacă l-ai numit ”mini tutorial” eu cred că ar fi bun pentru secțiunea de ”Articole și cod sursă”. |
#7
Posted 27 August 2013 - 17:04
Este de discutat. Am vrut doar un mic topic pentru începători. Și după cum am văzut că se mișcă lucrurile, ei nu vor căuta în altă parte. Cei care au trecut prin programare cam știu ce reprezintă debuggingul și cum se face.
Dorința mea ar fi să rămână aici cu sticky. |
#8
Posted 27 August 2013 - 17:14
Doar ca o completare: în Visual Studio (cel puțin 2012) poți pune un breakpoint și dacă dai click pe bara din stânga numerotării liniilor.
Eu cel puțin această opțiune o folosesc. |
#9
Posted 27 August 2013 - 17:18
Nu este o noutate în VS 2012. De fapt e chiar foarte vechi. Dar unora le mai tremură mâna, sau au o rezoluție mai mare a ecranului, iar linia devine dificil de selectat.
Însă fiecare face cum s-a obișnuit. |
#10
Posted 27 August 2013 - 17:24
Mă rog doar vroiam să spun că există posibilitatea.
Și cel puțin, dacă nu-ți tremură mâna și lucrezi destul de mult cu mouseul, e mult mai rapid să selectezi mai multe breakpointuri sau după caz să scapi de ele. |
|
#11
Posted 27 August 2013 - 20:03
sergiu37, on 27 august 2013 - 17:24, said:
Mă rog doar vroiam să spun că există posibilitatea. Și cel puțin, dacă nu-ți tremură mâna și lucrezi destul de mult cu mouseul, e mult mai rapid să selectezi mai multe breakpointuri sau după caz să scapi de ele. |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users