Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Sfat achizitie MTB Devron Riddle

Problema mare cu parintii= nervi ...

switch microtik

Permis categoria B la 17 ani
 Sfaturi pentru pregatirea de eval...

Crapaturi placa

cum imi accesez dosarul electroni...

Momentul Aprilie 1964
 Sursa noua - zgomot ?

A fost lansat Ubuntu 24.04 LTS

Pareri apartament in zona Berceni?

Free streaming SkyShowtime de la ...
 Skoda Fabia 1.0 TSI (110 CP)- 19 ...

Mezina familiei, Merida BigNine

The Tattooist of Auschwitz (2024)

Se poate recupera numar de telefo...
 

Debugging - mini tutorial

- - - - -
  • Please log in to reply
10 replies to this topic

#1
Cy_Cristian

Cy_Cristian

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 22.02.2009
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ă:
Attached File  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.
Attached File  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ă):
Attached File  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 softpedia
Lansăm gdb in executie:
gdb softpedia
Punem 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".

#2
Razvan090

Razvan090

    Junior Member

  • Grup: Members
  • Posts: 72
  • Înscris: 10.08.2013
mersi mult de tot, am inteles acuma.

#3
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View PostCy_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.
Uneori vrei sa ignori exact de un numar de ori, indiferent de conditiile de la runtime, sau a gasi o conditie potrivita este prea complicat. In gdb exista comanda
ignore <breakpoint> <count>


#4
Cy_Cristian

Cy_Cristian

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 22.02.2009
Exista si in VS. Fie ai hitcount, fie conditie in functie de variabile.

#5
potae

potae

    Sorosist frumos si liber

  • Grup: Senior Members
  • Posts: 3,429
  • Înscris: 20.08.2013
[ http://aug.imghost.us/EKer/dsds.jpg - Pentru incarcare in pagina (embed) Click aici ]

#6
adrian93

adrian93

    Active Member

  • Grup: Members
  • Posts: 1,740
  • Înscris: 29.10.2009
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
Cy_Cristian

Cy_Cristian

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 22.02.2009
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
sergiu37

sergiu37

    Member

  • Grup: Members
  • Posts: 328
  • Înscris: 13.11.2006
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
Cy_Cristian

Cy_Cristian

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 22.02.2009
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
sergiu37

sergiu37

    Member

  • Grup: Members
  • Posts: 328
  • Înscris: 13.11.2006
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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postsergiu37, 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.
Dacă eşti programtor şi lucrezi mult cu mouse-ul, ai o mare problemă.

Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate