Ruslails debugging cu un hema - debugger

Când codul se comportă într-un mod neașteptat, puteți introduce un jurnal sau o consolă pentru a identifica problema. Din păcate, uneori se întâmplă că acest mod de urmărire a erorii nu este eficient în găsirea cauzei problemei.





Când trebuie să călătoriți adânc în codul executabil, debuggerul este cel mai bun partener.

Depanatorul poate ajuta, de asemenea, dacă doriți să aflați codul sursă pentru Rails, dar nu știți de unde să începeți. Pur și simplu depanați orice cerere în aplicația dvs. și folosiți acest ghid pentru a afla cum mișcarea din codul pe care îl scrieți merge mai adânc în codul Rails.







Rails utilizează un program de depanare a bijuteriilor pentru a configura puncte de întrerupere și a trece prin codul live. Pentru ao instala, pur și simplu rulați:

Rails are suport încorporat pentru depanare, începând cu Rails 2.0. În cadrul oricărei aplicații pe Rails, puteți apela aplicația de depanare apelând metoda depanatorului.

Dacă vedeți un mesaj în consola sau jurnale:

Asigurați-vă că lansați serverul web cu opțiunea --debugger:

În modul de dezvoltare, puteți să apelați în mod dinamic solicitați \ 'debugger \' în loc să reporniți serverul dacă acesta a fost pornit fără --debugger.

Odată ce aplicația apelează metoda de depanare. programul de depanare va fi pornit în mediul de depanare în fereastra terminalului în care rulează serverul de aplicații și va fi prezentată linia de depanare (rdb: n). n este numărul de fire. Linia arată, de asemenea, următoarea linie de cod care așteaptă executarea.

Dacă o solicitare a fost primită de la browser, fila browser care conține cererea va fi suspendată până când debuggerul va termina și urmărirea va fi finalizată pentru procesarea întregii solicitări.

E timpul să studiezi și să sapi în cererea ta. Pentru a începe, este bine să cereți ajutor de la depanator ... așa scrie: help (În mod neașteptat, nu?)

Următoarea comandă, pe care o vom învăța, este una dintre cele mai utile: lista. Puteți scurta orice comenzi de depanare furnizând numai litere suficiente pentru a le deosebi de alte comenzi, astfel încât să puteți folosi l pentru comanda listei.

Această comandă arată unde vă aflați acum în cod, tastând 10 linii cu linia curentă din centru; Linia curentă în acest caz este a șasea și marcată =>.

Dacă repetați comanda de listă. Acum folosim doar l. următoarele 10 linii ale fișierului vor fi afișate.

Și așa mai departe până la sfârșitul dosarului curent. Când se ajunge la sfârșitul fișierului, comanda de listă va începe din nou de la începutul fișierului și va continua din nou până la final, procesând fișierul ca un buffer circular.

Pe de altă parte, pentru a vedea cele zece linii anterioare, trebuie să scrieți lista- sau l-.

În acest fel, puteți naviga în cadrul fișierului examinând codul înainte și după linia în care ați adăugat depanatorul. În cele din urmă, pentru a vedea din nou unde vă aflați în cod acum, puteți scrie lista =.

Când începeți să depanați aplicația, veți fi plasați în contexte diferite, pe măsură ce treceți prin diferite părți ale stivei.

Debuggerul creează un context când se atinge un punct de întrerupere sau un eveniment. Contextul conține informații despre un program suspendat care permite debuggerului să vizualizeze cadrul stivei, valorile variabilelor din perspectiva programului care se depanează și conține informații despre locul unde programul de depanare a fost oprit.

În orice moment, puteți apela backtrace (sau clauza în care se află) pentru a imprima urmărirea aplicației. Acest lucru este util pentru a ști unde vă aflați. Dacă v-ați întrebat vreodată cum aveți ceva în cod, atunci backtrace va oferi răspunsul.

Puteți merge acolo unde doriți în această urmă (aceasta va schimba contextul) utilizând comanda frame_n_. unde n este numărul de cadru specificat.

Variabilele disponibile sunt aceleași ca și când ați executat linia de cod prin linie. În cele din urmă, acesta este un lucru care este depistat.

Deplasarea pe cadrul stivei: puteți utiliza comenzile sus [n] (u) și în jos [n] pentru a schimba contextul pentru n cadre în sus sau în jos, respectiv. n este unul implicit. În acest caz, veți merge la cadrele de stivă cu un număr mai mare și până la cadre cu un număr mai mic.

Filamentele (firele)

Debuggerul poate vizualiza, opri, relua și schimba între firele care rulează folosind comanda fir (sau abreviată ca the). Această comandă are mai multe opțiuni:

  • firul afișează firul curent
  • Lista de fire este utilizată pentru a afișa toate firele și stările lor. Semnul plus și numărul indică firul de execuție curent.
  • oprirea firului _n_ oprește firul n.
  • threadul relua _n_ reia threadul n.
  • firul de fir _n_ comută contextul firului curent la n.

Această comandă este foarte utilă, în special atunci când depanați firele paralele și trebuie să vă asigurați că nu există nici o condiție de rasă în cod.

Orice expresie poate fi evaluată în contextul actual. Pentru a calcula expresia, tastați-o!

Acest exemplu va arăta modul în care puteți introduce instance_variables definite în contextul curent:

După cum ați înțeles deja, toate variabilele sunt afișate, la care există acces de la controler. Această listă este actualizată în mod dinamic pe măsură ce se execută codul. De exemplu, porniți următoarea linie folosind următorul (vom examina această comandă puțin mai târziu în acest tutorial).

Și apoi, din nou, cereți instanța_variabile:

De asemenea, puteți intra în modul irb cu comanda irb (desigur!). Astfel, sesiunea irb va fi lansată în contextul care a cauzat aceasta. Dar avertizăm: aceasta este o caracteristică experimentală.

Metoda var este o modalitate mai convenabilă de a arăta variabilele și valorile lor:

Comenzile p (print) și pp (destul de tipărite) pot fi folosite pentru a evalua expresiile Ruby și pentru a afișa valoarea variabilelor din consola.

Variabilele din lista afișată vor fi tipărite cu valorile lor după ce le puneți pe stivă. Pentru a opri afișarea unei variabile, utilizați dezvăluirea _n_. unde n este numărul variabilei (1 în ultimul exemplu).

Pas cu pas

Acum știți unde vă aflați în traseul de alergare și puteți tipări variabilele disponibile. Să continuăm și să ne cunoaștem implementarea aplicației.

Folosiți pasul (scurt pentru s) pentru a continua să executați programul până la următorul punct logic de întrerupere și debugger control de întoarcere.

De asemenea, puteți utiliza pasul + n și pasul-n pentru a vă deplasa înainte sau înapoi cu n pași, respectiv.

De asemenea, puteți utiliza următorul. care este similar cu pasul, dar apelurile către o funcție sau o metodă executate într-o linie de cod sunt executate fără oprire. Ca și pentru pas, puteți utiliza semnul plus pentru a trece la n pași.

Diferența dintre următoarea și pasul este că pasul se oprește pe următoarea linie de cod executabil, făcând un singur pas, în timp ce următorul se mută la linia următoare fără a introduce metodele din interior.

De exemplu, luați în considerare acest bloc de cod cu expresia de depanare inclusă:

Puteți folosi depanatorul când utilizați consola șinelor. Nu uitați să solicitați debugger înainte de a apela metoda de depanare.

Cu codul oprit, să ne uităm înapoi:

Dacă doriți să mergeți mai adânc în traseul de stivă, puteți trece printr-un pas pas cu pas. prin metodele de apelare și în codul Rails. Acesta este cel mai bun mod de a găsi bug-uri în codul dvs. și, eventual, în Ruby sau Rails.

breakpoints

Un punct de întrerupere vă oprește aplicația când se ajunge la un anumit punct din program. Această linie numește shell-ul de depanator.

Puteți adăuga puncte de întrerupere dinamic utilizând comanda break (sau doar b). Există 3 moduri posibile de a adăuga manual puncte de întrerupere:

  • linia de rupere. stabilește un punct de întrerupere în linia de linie din fișierul sursă curent.
  • pauză fișier: linie [dacă expresie]. stabilește un punct de întrerupere în linia de linie din fișierul de fișier. Dacă este specificată expresia. trebuie evaluat și egal cu adevărat. pentru a porni programul de depanare.
  • clasa break (. | #) [dacă este expresie]. stabilește un punct de întrerupere în metoda (și metoda # pentru clasă și metodă de instanță, respectiv) definite în clasa de clasă. expresia funcționează la fel ca în fișierul: line.

Utilizați punctele de întrerupere a informațiilor _n_ sau pauză de informații _n_ pentru a afișa o listă cu puncte de întrerupere. Dacă specificați un număr, va fi afișat numai acest punct de întrerupere. În caz contrar, toate punctele de întrerupere vor fi afișate.

Pentru a șterge puncte de întrerupere: utilizați comanda delete _n_ pentru a elimina numărul punctului de întrerupere n. Dacă numărul nu este specificat, toate punctele de întrerupere care sunt active în prezent sunt șterse.

De asemenea, puteți activa sau dezactiva întreruperile:

  • să permită punctele de întrerupere. permite lista punctelor de întrerupere sau tuturor acestora, dacă lista nu este definită, pentru a opri programul. Aceasta este starea implicită pentru punctele de întrerupere create.
  • dezactivați puncte de întrerupere. punctele de întrerupere nu vă vor afecta programul.

Capturarea excepțiilor

Excepția nume-captură (sau pur și simplu excepția-nume de pisică) poate fi utilizată pentru a intercepta o excepție de tip exception-name. atunci când ar fi apelat altfel la mâna de lucru.

Reluarea executării

Există două modalități de reluare a executării unei aplicații care a fost oprită de depanator:

editare

Pentru a ieși din depanator, utilizați comanda quit (abreviată la q) sau aliasul de ieșire.

O ieșire simplă încearcă să oprească toate firele ca rezultat. Prin urmare, serverul dvs. va fi oprit și va trebui să îl porniți din nou.

  • setați reîncărcarea. preîncărcați codul sursă când îl schimbați.
  • set autolist. Rulați comanda listă la fiecare punct de întrerupere.
  • setați listează _n_. Setați numărul de linii de cod care să fie afișate în mod implicit n.
  • setați forța. Asigurați-vă că comenzile următoare și pas întotdeauna comută la o nouă linie

Aceste setări pot fi salvate în fișierul .rdebugrc din directorul de domiciliu. Debuggerul citește aceste setări globale la pornire.

Iată un bun început pentru .rdebugrc:







Trimiteți-le prietenilor: