Felsökningsskenor med Pry Debugger

del 3 i serien en omfattande Guide till Felsökningsskenor

Rails Debugging med Pry

om du ännu inte vet vad en felsökningssession är, tänk på det som att öppna Rails-konsolen vid en vald punkt i exekveringsvägen.

jag antar nedan att du har installerat Pry-debugger och pry-stack_explorer gems.

när som helst i din källkod (inklusive i den nedladdade koden för gems som ingår i din Gemfile och öppnas bekvämt i Textredigeraren med bundle open gem_name) kan du infoga radbindningen.bända. När Ruby-tolken kör den linjen stoppar den vad den gör och öppnar en Pry REPL-session vid den tiden. Hade du interagerat med webbplatsen via webbläsaren måste du byta program till fliken terminal console där din Rails-server körde för att du skulle se Pry-sessionen.

för tydlighetens skull förklara vad som är att följa Jag inkluderar en kod-utdrag här.

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

inom din Pry-konsol har du alla funktioner som redan nämnts för att inspektera tillståndet eller introspektera ditt program med liknande ls-produkter. Felsökning lägger stack navigering över stack ramar. Låt oss ligga lite och definiera en stapelram som en ”REPL-konsol öppnad vid någon av de möjliga punkterna längs stackspåret varför kanske vi vill navigera i stapelramar? För att ytterligare identifiera vårt fel genom att leta efter mer specifika orsaker. Vi gör det ibland genom att leta efter det ögonblick då en viss variabel ändrar värde (t.ex. en cookie blir inställd). Andra gånger navigerar vi för att observera exekveringsflödet och jämföra vad vi förväntar oss med det vi ser. Till exempel kanske du märker att fel gren av en if-else-konstruktion utfördes.

efter att ha kört place_everything_on_sale i kodavsnittet ovan kommer du att lanseras i en Pry-session inom place_on_sale – metoden och presenteras med en fråga om vad du vill göra nästa.

  • stegkommandot fortsätter exekveringen genom att flytta dig till metoden på nästa rad och ändra din stackram för att vara inne i den metoden. Formulerade ett annat sätt Det går djupare. Efter vårt kodexempel kommer running step att ta dig inom generate_products – metoden, då kommer du att bli frågad vad du vill göra nästa.

  • du har ”gått” in i generate_products – metoden med step ovan, men nu har du bestämt dig för att du vill hoppa till slutet av generated_products – metoden utan att felsökaren frågar efter ditt val av navigeringskommando efter varje rad. Skriv finish för att köra tills den aktuella stapelramen har kört varje rad, stängt och returnera ett värde och därigenom ytbehandlas med en nivå, som rör sig tillbaka till stapelramen från vilken du tidigare hade gått ut ur. Efter exemplet tar det dig tillbaka till place_on_sale – metoden till den punkt efter att tolken har utvärderat generated_products.

  • nästa kommando kör den aktuella raden och flyttar till nästa rad eller metod i det aktuella sammanhanget, dvs. fortskrider utan att ändra stapelramen. Formulerat på ett annat sätt, fortsätt en rad ner den nuvarande metoden utan att gå djupare. Om man tittar på kodexemplet (och låtsas att vi bara hade startat om vårt program, kör place_everything_on_sale och nyligen öppnat en Pry-session), skriver next fullständigt generate_products utan att släppa dig in i dess interna då kommer det att tilldela returvärdet till new_products-variabeln. Nexts är större att steg, eller i Rails termer, en nästa has_many steg. All kod inom generate_products-metoden (som annars skulle vara många steg) har avslutats med en enda användning av kommandot next. Ditt nästa navigeringsbeslut kommer att vara om du ska gå, nästa på new_product.advertise.

  • lämna Pry-sessionen och fortsätt programkörningen som vanligt med kommandot continue. Om tolken möter en annan bindning.pry-uttalande, (vilket kommer att hända när du ringer till place_everyone_on_sale – metoden ovan), kommer den att utföra place_on_sale-metoden en gång för varje säljare och öppnar därför en Pry-session på varje iteration. Detta kan vara otroligt irriterande, eftersom ditt program kommer att sluta och du måste navigera i felsökaren varje gång, så du kommer förmodligen att skriva exit-program för att avbryta effekten av någon följande bindning.bända uttalanden, utan att, så att säga, avsluta ditt Rails-program.

  • visa källkoden för den metod du befinner dig inom: whereami perfekt för att bekräfta att du är i rätt klass eller för att se var du har hamnat efter att ha rest genom några ramar i din felsökningssession.

  • Skriv ut och navigera call stack när ett undantag höjs i Ruby det skriver en stack spår av alla metoder som kallas före detta undantag. Ibland vill du se stackspåret hittills trots att det inte finns något undantag. Tack vare en viss pry-förlängning installerad genom att lägga till pry-stack_explorer gem kan du göra det med show-stack -v. Detta kommando matar ut stackspåret, vilket indikerar den aktuella ramen med en pil. Du kan navigera till en annan ram med upp eller ”upp {n}”, t.ex. upp 3 för att gå uppåt tre ramar, det vill säga flytta din REPL till sammanhanget med metoden som kallade metoden (och så vidare…) som så småningom kallade metoden där du för närvarande är placerad. Skriv show-stack för att se var du har flyttat till i stapeln och ner för att flytta ramar i motsatt riktning.

  • avsluta sammanhang med ett värde: Ibland vill du manipulera programflödet genom att returnera ett visst värde från en Pry-session. För ett ansträngt exempel, föreställ dig att du hade en kodrad som läste first_name = binding.pry. First_name-variabeln tilldelas utmatningen från Pry-sessionen, och du kan ställa in detta värde till jack med exit "jack".

ibland vill du ange exakt när bindningen.pry kommer att spricka öppna en pry-session. Jag gör detta 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 omfattande Guide till Felsökningsskenor Rails Debugging med Pry om du ännu inte vet vad en felsökningssession är, tänk på det som att öppna Rails-konsolen vid en vald punkt i exekveringsvägen. jag antar nedan att du har installerat Pry-debugger och pry-stack_explorer gems. när som helst i din källkod (inklusive i den…

del 3 i serien en omfattande Guide till Felsökningsskenor Rails Debugging med Pry om du ännu inte vet vad en felsökningssession är, tänk på det som att öppna Rails-konsolen vid en vald punkt i exekveringsvägen. jag antar nedan att du har installerat Pry-debugger och pry-stack_explorer gems. när som helst i din källkod (inklusive i den…

Lämna ett svar

Din e-postadress kommer inte publiceras.