Sari la conținutul principal

Depanare (Debug)

Permite analizarea execuției codului în timp real.

Introducere​

În timpul programării se întâmplă adesea să fie necesară analizarea execuției codului.

În cazul Netuno putem folosi:

  • _out.print - Pentru a afișa o informație în ieșirea de date (output).
  • _log.info - Pentru a afișa o informație în terminalul serverului Netuno.

Totuși se întâmplă și să existe scenarii mai complexe în care dorim să analizăm mai în profunzime, de exemplu să verificăm mai multe valori ale obiectelor și variabilelor în același timp, să testăm execuția unui cod specific în acest context, totul pentru a înțelege mai bine comportamentul.

Este întotdeauna posibil să folosim în aceste cazuri mai complexe metodele arătate mai sus precum _out.print și _log.info, însă putem ajunge într-un proces foarte laborios și confuz pentru a ajunge la o bună înțelegere a ceea ce se întâmplă.

Depanarea (debug) servește tocmai pentru a oferi o bună înțelegere a ceea ce se întâmplă, în special în situații mai complexe.

Depanarea (în engleză: debugging, debug) este procesul utilizat în dezvoltare pentru a găsi și a reduce defectele, erorile, comportamentele greșite etc.

Depanarea poate fi împărțită în 3 mecanisme importante:

  • Punct de Întrerupere (Break Point): Face ca execuția codului să se oprească, putem apoi începe investigația acolo unde codul este oprit.
  • Observare (Watch): Permite observarea valorilor variabilelor acolo unde codul este oprit.
  • Execuție de Cod (Code Execution): Putem executa orice cod temporar, pentru a efectua un anumit test în punctul în care execuția este oprită pentru depanare.

Punct de Întrerupere (Breakpoint)​

Punctul de întrerupere (breakpoint) este locul din cod unde execuția trebuie să fie suspendată pentru a începe procesul de depanare.

Pentru a începe depanarea în orice cod și în oricare limbaj suportat de Netuno, precum JavaScript, Python, Ruby, Kotlin sau Groovy, în locul în care dorești să începi depanarea, adaugă următorul cod:

_exec.debug()

Deoarece Netuno este poliglot, funcționează cu orice limbaj suportat, precum: JavaScript, Python, Kotlin, Ruby, sau Groovy.

Acum, pentru a începe depanarea, execută codul și execuția va rămâne blocată, în pauză.

Așadar mergem în interfața de dezvoltare, în backoffice la Construir, iar în meniul din partea stângă avem opțiunea:

  • Depanare

Unde putem găsi săgeata dublă verde care indică faptul că, la clic pe ea, execuția va putea continua:

Debug - Continuare

Săgeata dublă verde întrerupe pauza depanării făcând ca execuția codului să continue normal din punctul în care s-a oprit.

Observare (Watch)​

Pentru a vedea valoarea variabilelor folosim lupa galbenă.

La clic pe lupa galbenă putem introduce numele variabilei a cărei valoare dorim să o observăm.

Debug - Observare

Numele variabilei și valoarea sa actuală apar în listă, putem observa valoarea mai multor variabile, iar dacă o variabilă nu există atunci nu va exista nicio valoare.

Executare Cod (Execute Code)​

Putem injecta cod pentru a fi executat în contextul punctului de întrerupere, adică acolo unde depanarea este în curs.

Dăm clic pe simbolul de cod albastru și putem introduce codul pe care intenționăm să îl executăm.

Debug - Executare Cod

Codul executat este prezentat în lista de mai jos cu indicarea faptului că codul a fost executat cu succes, iar dacă există vreo eroare atunci mesajul de eroare este prezentat împreună cu codul.

Configurare pentru Depanare la Distanță​

La rularea Netuno local nu ar trebui să fie necesară nicio configurare.

Deoarece în dezvoltarea locală host-ul adresei WebSocket este configurat automat.

Adresele locale folosesc de obicei aceste valori ca host:

  • localhost
  • 127.0.0.1
  • 192.168.1.* - Exemplu de orice IP de rețea locală.
  • aplicatia-mea.local.netu.no

Adresele locale nu necesită nicio configurare, prin urmare acest pas poate fi omis.

În schimb, în producție sau în dezvoltarea la distanță, precum în container sau VPN, poate fi necesar să se definească adresa externă (IP sau domeniu) care este utilizată pentru conexiunea WebSocket.

În acest caz, navighează în cadrul aplicației care este în curs de dezvoltare până la fișierul de configurare de mediu. În acest exemplu, vom folosi fișierul de mediu de dezvoltare, care se află în:

  • 📂 config/_development.json

Verifică dacă nu cumva există deja configurarea, dacă nu există adaugă la sfârșitul fișierului de configurare (în format JSON) parametrii de configurare ai adresei externe care urmează să fie utilizată în conexiunea WebSocket, de exemplu:

{
...
"dev": {
"ws": {
"host": "dev.netuno.org"
}
},
...
}

Informația despre port nu trebuie adăugată la adresa de host în WebSocket.

De asemenea, pot fi transmise mai multe adrese de host într-un array:

{
...
"dev": {
"ws": {
"host": [ "containerul-meu.dev.netuno.org", "proiectul-meu.com" ]
}
},
...
}

Proxy în Producție (NGINX)​

În producție este obișnuit să fie utilizat un server web care face proxy invers, precum NGINX.

Pentru ca depanarea să funcționeze prin proxy este necesar să se adauge o configurare specifică pentru a redirecționa traficul legat de adresa WebSocket:

server {
listen 443 ssl;
server_name proiectul-meu.com;

...

location /dev/ws/ {
proxy_pass http://127.0.0.1:9000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_http_version 1.1;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
add_header X-Frame-Options "";
}
}

Concluzie​

Cu interfața de depanare și comanda _exec.debug() putem realiza o investigație profundă a ceea ce se întâmplă.

În majoritatea limbajelor și tehnologiilor de backend, în special tehnologiile de script, depanarea este de obicei imposibilă sau complexă.

Netuno oferă o modalitate simplă de a depana codul poliglot care funcționează în diversele limbaje suportate, precum JavaScript, Python, Ruby, Kotlin și Groovy.

Permite depanarea poliglotă în medii la distanță și în producție.

Utilizarea depanării accelerează foarte mult dezvoltarea oferind o mai mare precizie în rezolvarea problemelor și devine un instrument esențial, încearcă.