debuggen van Rails met Pry Debugger
deel 3 in de Serie A Comprehensive Guide To Debugging Rails
Rails debuggen met Pry
als u nog niet weet wat een debugging sessie is, zie het dan als het openen van de Rails console op een gekozen punt in het uitvoerpad.
hieronder neem ik aan dat u de Pry-debugger en de pry-stack_explorer edelstenen hebt geïnstalleerd.
op elk punt in uw broncode (inclusief in de gedownloade code van de edelstenen in uw Gemfile en gemakkelijk geopend in de teksteditor met bundel open gem_name) kunt u de regelbinding invoegen.wrikken. Wanneer de Ruby interpreter voert die Regel, het stopt wat het doet en opent een Pry REPL sessie op dat punt. Had je interactie met de website via de browser je nodig hebt om programma ‘ s te schakelen naar de terminal console tab waarop uw Rails server werd uitgevoerd voor u om de Pry sessie te zien.
voor de duidelijkheid bij het uitleggen van wat er volgt, neem ik hier een code-fragment op.
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
binnen uw Pry console hebt u alle genoemde functies al om de status te inspecteren of uw programma te introspecteren met de wil van ls product. Debugging voegt stack navigatie over stack frames. Laten we een beetje liggen en definiëren een stack frame als een ” REPL console geopend op een van de mogelijke punten langs de stack trace waarom zouden we willen stack frames navigeren? Om onze fout verder te lokaliseren door te zoeken naar meer specifieke oorzaken. We doen dit soms door te zoeken naar het moment waarop een bepaalde variabele van waarde verandert (bijvoorbeeld een cookie wordt ingesteld). Andere keren navigeren we om de stroom van uitvoering te observeren en vergelijken we wat we verwachten met wat we zien. Je zou bijvoorbeeld kunnen opmerken dat de verkeerde branch van een IF-else construct is uitgevoerd.
nadat u place_everything_on_sale
in het codefragment hierboven hebt uitgevoerd, wordt u in een Pry-sessie binnen de place_on_sale
– methode gestart en krijgt u de vraag te zien wat u hierna wilt doen.
-
het step Commando zet de uitvoering voort door je naar de methode op de volgende regel te verplaatsen, waarbij je je stack frame verandert om binnen die methode te zijn. Anders geformuleerd gaat het dieper. In navolging van ons code voorbeeld, zal het uitvoeren van
step
je binnen degenerate_products
methode brengen, waarna je gevraagd wordt wat je hierna wilt doen. -
u hebt” getrapt ” in de
generate_products
methode metstep
hierboven, maar nu hebt u besloten dat u naar het einde van degenerated_products
methode wilt overslaan zonder dat de debugger na elke regel om uw navigatieopdracht vraagt. Typfinish
om uit te voeren totdat het huidige stack-frame elke regel heeft uitgevoerd, gesloten en een waarde retourneert, waardoor het een niveau boven water komt, dat terug gaat naar het stack-frame waaruit u eerder was uitgegaan. Het voorbeeld volgend brengt u terug in deplace_on_sale
methode naar het punt nadat de interpretergenerated_products
heeft geëvalueerd. -
het volgende commando voert de huidige regel uit en gaat naar de volgende regel of methode in de huidige context, dat wil zeggen vooruitgang zonder stack frame te veranderen. Op een andere manier geformuleerd, ga een regel verder langs de huidige methode zonder dieper te gaan. Kijkend naar het code voorbeeld, (en doen alsof we net ons programma herstartten , draaien
place_everything_on_sale
, en vers geopend een Pry sessie), het typen vannext
zal de generate_products volledig uit te voeren zonder u te laten vallen in zijn interne dan zal het de return waarde toewijzen aan de new_products variabele. Nexts zijn groter dan steps, of in Rails termen, een next has_many steps. Alle code binnen de generate_products methode (die anders veel stappen zou zijn), is afgesloten met een eenmalig gebruik van hetnext
Commando. Uw volgende navigatiebeslissing zal zijn of u stap, volgende opnew_product.advertise
. -
Beëindig de Pry-sessie en ga verder met het uitvoeren van het programma zoals normaal met het
continue
Commando. Als de tolk een andere binding tegenkomt.pry statement, (wat zal gebeuren als je deplace_everyone_on_sale
methode hierboven aanroept), het zal de place_on_sale methode één keer uitvoeren voor elke verkoper, en daarom een Pry sessie openen op elke iteratie. Dit kan ongelooflijk vervelend zijn, omdat je programma zal stoppen en je elke keer door de debugger moet navigeren, dus je zult waarschijnlijkexit-program
willen typen om het effect van een volgende binding te annuleren.wrikken verklaringen, zonder, bij wijze van spreken het verlaten van uw Rails programma. -
bekijk de broncode van de methode waarin u zich momenteel bevindt:
whereami
geweldig om te bevestigen dat u in de juiste klasse zit of om te zien waar u terecht bent gekomen na het doorlopen van een paar frames in uw debugsessie. -
Print en navigeer call stack wanneer een uitzondering wordt verhoogd in Ruby het drukt een stack trace van alle methoden genoemd voorafgaand aan die uitzondering. Soms wil je de stack trace tot nu toe te bekijken, ondanks dat er geen uitzondering verhoogd. Dankzij een bepaalde pry-extensie die is geïnstalleerd door het
pry-stack_explorer
gem toe te voegen, kunt u dit doen metshow-stack -v
. Dit commando voert de stack trace uit, die met een pijl het huidige frame aangeeft. U kunt naar een ander frame navigeren met up of “up {n}”, bijvoorbeeld up 3 om drie frames omhoog te gaan, dat wil zeggen uw REPL verplaatsen naar de context van de methode die de methode noemde (enzovoort…) die uiteindelijk de methode noemde waarin u momenteel geplaatst bent. Typshow-stack
om te zien waar u naartoe bent verhuisd in de stack, en naar beneden om frames in de tegenovergestelde richting te verplaatsen. -
Exit-context met een waarde: Soms wil je de programmastroom manipuleren door een bepaalde waarde van een Pry sessie terug te geven. Voor een gespannen voorbeeld, stel je voor dat je een regel code hebt die
first_name = binding.pry
leest. De first_name variabele krijgt de uitvoer van de Pry sessie toegewezen, en u kunt deze waarde instellen op jack metexit "jack"
.
soms wilt u precies opgeven wanneer de binding.wriem zal een wriem-sessie openen. Ik doe dit met Ruby code voorwaarden:
binding.pry if session == true binding.pry if @first_name == "Jack" binding.pry if iteration > 4
deel 3 in de Serie A Comprehensive Guide To Debugging Rails Rails debuggen met Pry als u nog niet weet wat een debugging sessie is, zie het dan als het openen van de Rails console op een gekozen punt in het uitvoerpad. hieronder neem ik aan dat u de Pry-debugger en de pry-stack_explorer edelstenen hebt…
deel 3 in de Serie A Comprehensive Guide To Debugging Rails Rails debuggen met Pry als u nog niet weet wat een debugging sessie is, zie het dan als het openen van de Rails console op een gekozen punt in het uitvoerpad. hieronder neem ik aan dat u de Pry-debugger en de pry-stack_explorer edelstenen hebt…