Debugging Rails med Pry Debugger

Del 3 i serien En omfattende Guide til Debugging Rails

Rails Debugging med Pry

hvis du endnu ikke ved, hvad en debugging session er, tænk på det som at åbne Rails konsol på et valgt punkt i udførelsen sti.

jeg antager nedenfor, at du har installeret Pry-debugger og pry-stack_udforsker gems.

på ethvert tidspunkt i din kildekode (herunder inden for den hentede kode af ædelstene inkluderet i din Gemfile og bekvemt åbnes i teksteditoren med bundle open gem_name) kan du indsætte linjen binding.lirke. Når Ruby-tolken udfører den linje, stopper den, hvad den laver, og åbner en Pry REPL-session på det tidspunkt. Hvis du har interageret med hjemmesiden via bro.ser, skal du skifte programmer til fanen terminal console, hvor din Rails-server kørte, så du kan se Pry-sessionen.

af hensyn til klarheden i at forklare, hvad der skal følges, inkluderer jeg et kodestykke her.

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

i din Pry-konsol har du alle de funktioner, der allerede er nævnt for at inspicere tilstand eller introspect dit program med lignende LS-produkt. Debugging tilføjer staknavigation på tværs af stakrammer. Lad os ligge lidt og definere en stakramme som en “REPL-konsol åbnet på et af de mulige punkter langs staksporet Hvorfor vil vi måske navigere i stakrammer? For yderligere at lokalisere vores fejl ved at lede efter mere specifikke årsager. Det gør vi nogle gange ved at kigge efter det øjeblik, hvor en bestemt variabel ændrer værdi (f.eks. Andre gange navigerer vi for at observere strømmen af udførelse og sammenligne, hvad vi forventer med det, vi ser. For eksempel kan du bemærke, at den forkerte gren af en If-else-konstruktion blev udført.

efter at have udført place_everything_on_sale i kodestykket ovenfor finder du dig selv lanceret i en Lirkesession inden for place_on_sale – metoden og præsenteret med et spørgsmål om, hvad du gerne vil gøre næste.

  • trinkommandoen fortsætter udførelsen ved at flytte dig ind i metoden på den næste linje og ændre din stakramme til at være inde i denne metode. Formuleret på en anden måde går det dybere. Efter vores kodeeksempel vil kørsel step bringe dig inden for generate_products – metoden, hvorefter du bliver spurgt, hvad du vil gøre næste gang.

  • du har “trådt” ind i generate_products – metoden med step ovenfor, men nu har du besluttet, at du vil springe til slutningen af generated_products – metoden uden at debuggeren beder om dit valg af navigationskommando efter hver linje. Skriv finish for at udføre, indtil den aktuelle stakramme har kørt hver linje, lukket og returnerer en værdi, hvorved der vises et niveau, der bevæger sig tilbage i stakrammen, hvorfra du tidligere var trådt ud af. Efter eksemplet bringer det dig tilbage til place_on_sale – metoden til det punkt, efter at tolken har evalueret generated_products.

  • den næste kommando kører den aktuelle linje og flytter til den næste linje eller metode i den aktuelle kontekst, dvs.skrider frem uden at ændre stakrammen. Formuleret på en anden måde, fortsæt en linje ned ad den aktuelle metode uden at gå dybere. Ser man på kodeeksemplet (og foregiver at vi lige havde genstartet vores program, kørt place_everything_on_sale og åbnet en Pry-session), vil skrive next helt udføre generate_products uden at tabe dig ind i dets interne, så vil det tildele returværdien til variablen ny_products. Næste er større, at trin, eller i Skinner vilkår, en næste has_many trin. Al koden inden for generate_products-metoden (som ellers ville være mange trin), er afsluttet med en enkelt brug af kommandoen next. Din næste navigationsbeslutning vil være, om du skal træde, næste på new_product.advertise.

  • Forlad Pry-sessionen, og fortsæt programudførelsen som normalt med kommandoen continue. Hvis tolken møder en anden binding.pry-erklæring, (som vil ske, når du kalder place_everyone_on_sale – metoden ovenfor), vil den udføre place_on_sale-metoden en gang for hver sælger og derfor åbne en Pry-session på hver iteration. Dette kan være utroligt irriterende, da dit program stopper, og du bliver nødt til at navigere i debuggeren hver eneste gang, så du vil sandsynligvis skrive exit-program for at annullere effekten af følgende binding.pry udsagn, uden, så at sige afslutter dit Rails-program.

  • se kildekoden til den metode, du er i øjeblikket inden for: whereami fantastisk til at bekræfte, at du er i den rigtige klasse eller for at se, hvor du er havnet efter at have rejst gennem et par rammer i din debugging session.

  • Udskriv og naviger call stack når en undtagelse hæves i Ruby, udskriver den et stakspor af alle de metoder, der kaldes før denne undtagelse. Nogle gange vil du se stakken spor hidtil på trods af at der ikke er nogen undtagelse hævet. Takket være en bestemt pry-udvidelse installeret ved at tilføje pry-stack_explorer gem, kan du gøre dette med show-stack -v. Denne kommando udsender staksporingen, der angiver den aktuelle ramme med en pil. Du kan navigere til en anden ramme med op eller “op {n}”, f.eks. op 3 for at gå opad tre rammer, det vil sige flytte din REPL til sammenhængen med den metode, der kaldte metoden (og så videre…), der til sidst kaldte den metode, hvor du i øjeblikket er placeret. Skriv show-stack for at se, hvor du er flyttet til i stakken, og ned for at flytte rammer i den modsatte retning.

  • Afslut kontekst med en værdi: Nogle gange vil du manipulere programstrømmen ved at returnere en bestemt værdi fra en Lirkesession. For et anstrengt eksempel, forestil dig, at du havde en kodelinje, der læste first_name = binding.pry. Variablen first_name tildeles output fra Pry-sessionen, og du kan indstille denne værdi til jack med exit "jack".

nogle gange vil du angive nøjagtigt, når bindingen.pry vil knække åbne en pry-session. Jeg gør dette med Ruby code conditionals:

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

Del 3 i serien En omfattende Guide til Debugging Rails Rails Debugging med Pry hvis du endnu ikke ved, hvad en debugging session er, tænk på det som at åbne Rails konsol på et valgt punkt i udførelsen sti. jeg antager nedenfor, at du har installeret Pry-debugger og pry-stack_udforsker gems. på ethvert tidspunkt i din…

Del 3 i serien En omfattende Guide til Debugging Rails Rails Debugging med Pry hvis du endnu ikke ved, hvad en debugging session er, tænk på det som at åbne Rails konsol på et valgt punkt i udførelsen sti. jeg antager nedenfor, at du har installeret Pry-debugger og pry-stack_udforsker gems. på ethvert tidspunkt i din…

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.