Debugging Rails with Pry Debugger

Part 3 in the series A Comprehensive Guide To Debugging Rails

Rails Debugging with Pry

dacă nu știți încă ce este o sesiune de depanare, gândiți-vă la aceasta ca la deschiderea consolei Rails într-un punct ales în calea de execuție.

presupun mai jos că ați instalat Pry-debugger și pietre pry-stack_explorer.

în orice moment al codului sursă (inclusiv în codul descărcat al pietrelor incluse în Gemfile și deschis convenabil în editorul de text cu bundle open gem_name) puteți introduce legarea liniei.trage. Ori de câte ori interpretul Ruby execută acea linie, se oprește ceea ce face și deschide o sesiune de REPL trageți în acel moment. Dacă ați fi interacționat cu site-ul web prin intermediul browserului, va trebui să comutați programele la fila consolei terminale în care rulează serverul Rails pentru a vedea sesiunea Pry.

din motive de claritate în explicarea a ceea ce urmează, includ aici un fragment de cod.

def place_everyone_on_sale Seller.all.each do |seller| place_on_sale(seller) endenddef place_on_sale(seller) binding.pry # Execution will stop here. new_products = generate_products(seller) new_product.advertise new_productsenddef generate_products(seller) seller.documents.each do |document| document.place_online if document.releasable endend

în consola trageți aveți toate caracteristicile menționate deja pentru a inspecta starea sau introspecție programul cu place de produs ls. Debugging adaugă navigare stivă peste cadre stivă. Vă permite să mințiți puțin și să definiți un cadru de stivă ca o „consolă REPL deschisă în oricare dintre punctele posibile de-a lungul traseului stivei de ce am putea dori să navigăm în cadrele stivei? Pentru a identifica în continuare eroarea noastră, căutând cauze mai specifice. Facem acest lucru uneori căutând momentul în care o anumită variabilă își schimbă valoarea (de exemplu, un cookie este setat). Alteori navigăm pentru a observa fluxul de execuție, comparând ceea ce ne așteptăm cu ceea ce vedem. De exemplu, s-ar putea observa că ramura greșită a unui construct if-else a fost executată.

după ce ați executat place_everything_on_sale în fragmentul de cod de mai sus, veți fi lansat într-o sesiune de tragere în cadrul metodei place_on_sale și vă veți prezenta o întrebare despre ce doriți să faceți în continuare.

  • comanda step continuă execuția mutându-vă în metoda de pe linia următoare, schimbând cadrul stivei pentru a fi în interiorul acelei metode. Formulată într-un alt mod merge mai adânc. Urmând exemplul nostru de cod, rularea step vă va aduce în cadrul metodei generate_products, moment în care veți fi întrebat ce doriți să faceți în continuare.

  • ați „pășit” în metoda generate_products cu step de mai sus, dar acum ați decis că doriți să treceți la sfârșitul metodei generated_products fără ca depanatorul să vă solicite alegerea comenzii de navigare după fiecare linie. Tastați finish pentru a executa până când cadrul stivei curente a rulat fiecare linie, a închis și a returna o valoare, ieșind astfel la suprafață cu un nivel, care se deplasează înapoi în cadrul stivei din care ați ieșit anterior. Urmând exemplul, acest lucru vă aduce înapoi în metoda place_on_salepână la punctul după ce interpretul a evaluat generated_products.

  • următoarea comandă rulează linia curentă și trece la următoarea linie sau metodă în contextul curent, adică progresează fără a schimba cadrul stivei. Formulată într-un alt mod, continuați o linie în jos metoda curentă fără a merge mai adânc. Privind la exemplul de cod, (și pretinzând că ne-am repornit doar programul nostru , rula place_everything_on_sale, și proaspăt deschis o sesiune de Pry), tastând next va executa complet generate_products fără cădere în sale interne, atunci se va atribui valoarea returnată la new_products variabilă. Următoarele sunt mai mari decât pașii sau, în termeni de șine, următorii pași has_many. Tot codul din cadrul metodei generate_products (care altfel ar fi mulți pași), a fost încheiat cu o singură utilizare a comenzii next. Următoarea decizie de navigare va fi dacă să pas, următorul la new_product.advertise.

  • abandonați sesiunea Pry și continuați execuția programului în mod normal cu comanda continue. Dacă interpretul întâlnește o altă legare.declarația pry (care se va întâmpla atunci când apelați metoda place_everyone_on_sale de mai sus), va executa metoda place_on_sale o dată pentru fiecare vânzător, deschizând astfel o sesiune Pry la fiecare iterație. Acest lucru poate fi incredibil de enervant, deoarece programul dvs. se va opri și va trebui să navigați în depanator de fiecare dată, așa că probabil veți dori să tastați exit-program pentru a anula efectul oricărei legături următoare.trageți declarații, fără, ca să spunem așa ieșirea din programul Rails.

  • Vizualizați codul sursă al metodei în care vă aflați în prezent: whereami excelent pentru a confirma că sunteți în clasa potrivită sau pentru a vedea unde ați ajuns după ce ați călătorit prin câteva cadre în sesiunea de depanare.

  • imprimare și navigați stivă apel atunci când o excepție este ridicată în Ruby se imprimă o urmă stivă a tuturor metodelor numite înainte de această excepție. Uneori doriți să vizualizați urmele stivei până acum, în ciuda faptului că nu există nicio excepție ridicată. Datorită unei extensii speciale instalate prin adăugarea gemului pry-stack_explorer, puteți face acest lucru cu show-stack -v. Această comandă scoate urma stivei, indicând cadrul curent cu o săgeată. Puteți naviga la un alt cadru cu sus sau „sus {n}”, de ex.sus 3 pentru a merge în sus trei cadre, adică mutați-vă Replica în contextul metodei care a numit metoda (și așa mai departe…) care a numit în cele din urmă metoda în care sunteți plasat în prezent. Tastați show-stack pentru a vedea unde v-ați mutat în stivă și în jos pentru a muta cadrele în direcția opusă.

  • ieșiți din context cu o valoare: Uneori doriți să manipulați fluxul de programe returnând o anumită valoare dintr-o sesiune Pry. Pentru un exemplu tensionat, imaginați-vă că aveți o linie de cod care citește first_name = binding.pry. Variabilei first_name i se atribuie ieșirea din sesiunea Pry și puteți seta această valoare la jack cu exit "jack".

uneori doriți să specificați exact când legarea.pry va deschide o sesiune de pry. Fac acest lucru cu Ruby code conditionals:

 binding.pry if session == true binding.pry if @first_name == "Jack" binding.pry if iteration > 4

Part 3 in the series A Comprehensive Guide To Debugging Rails Rails Debugging with Pry dacă nu știți încă ce este o sesiune de depanare, gândiți-vă la aceasta ca la deschiderea consolei Rails într-un punct ales în calea de execuție. presupun mai jos că ați instalat Pry-debugger și pietre pry-stack_explorer. în orice moment al codului…

Part 3 in the series A Comprehensive Guide To Debugging Rails Rails Debugging with Pry dacă nu știți încă ce este o sesiune de depanare, gândiți-vă la aceasta ca la deschiderea consolei Rails într-un punct ales în calea de execuție. presupun mai jos că ați instalat Pry-debugger și pietre pry-stack_explorer. în orice moment al codului…

Lasă un răspuns

Adresa ta de email nu va fi publicată.