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 de generate_products methode brengen, waarna je gevraagd wordt wat je hierna wilt doen.

  • u hebt” getrapt ” in de generate_products methode met step hierboven, maar nu hebt u besloten dat u naar het einde van de generated_products methode wilt overslaan zonder dat de debugger na elke regel om uw navigatieopdracht vraagt. Typ finish 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 de place_on_sale methode naar het punt nadat de interpreter generated_productsheeft 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 van next 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 het next Commando. Uw volgende navigatiebeslissing zal zijn of u stap, volgende op new_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 de place_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 waarschijnlijk exit-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 met show-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. Typ show-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.pryleest. De first_name variabele krijgt de uitvoer van de Pry sessie toegewezen, en u kunt deze waarde instellen op jack met exit "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…

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.