Debugging Rails with Pry Debugger
Part 3 in the series A Comprehensive Guide To debug Rails
Rails Debugging with Pry
If you don’t yet know what a debugging session is, think of it as opening the Rails console at a chosen in the execution path.
presumo abaixo que tenha instalado o depurador Pry e as pedras preciosas pry-stack_explorer.
em qualquer ponto do seu código-fonte (incluindo dentro do Código Transferido das Pedras Preciosas incluídas no seu ficheiro Gemfile e convenientemente Aberto no editor de texto com o pacote open gem_name), poderá inserir a ligação à linha.levantar. Sempre que o interpretador Ruby executa essa linha, ele pára o que está fazendo e abre uma sessão Pry REPL nesse ponto. Se você estivesse interagindo com o site através do navegador, você precisará mudar os programas para a página da consola de terminal em que seu servidor de Rails estava rodando para que você veja a sessão de Pry.
por uma questão de clareza ao explicar o que deve seguir eu incluo um excerto de código aqui.
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
dentro do seu console Pry você tem todas as características mencionadas já para inspecionar estado ou introspeccionar o seu programa com os produtos ls. A depuração adiciona a navegação da pilha em todas as molduras da pilha. Vamos deitar um pouco e definir uma moldura de pilha como um ” console REPL aberto em qualquer um dos pontos possíveis ao longo da pilha trace por que nós poderíamos querer navegar os frames de pilha? Para identificar ainda mais o nosso erro, procurando causas mais específicas. Fazemos isso às vezes, procurando o momento em que uma determinada variável muda de valor (por exemplo, um cookie fica definido). Outras vezes navegamos para observar o fluxo de execução, comparando o que esperamos com o que vemos. Por exemplo, você pode notar que o ramo errado de uma construção if-else foi executado.
tendo executado place_everything_on_sale
no excerto de código acima, você vai encontrar-se lançado em uma sessão de Pry dentro do método place_on_sale
e apresentado com uma questão do que você gostaria de fazer a seguir.
-
o comando step continua a execução, movendo-o para o método na linha seguinte, mudando a sua estrutura de pilha para estar dentro desse método. Disse de outra forma que vai mais fundo. Seguindo o nosso exemplo de código, a execução de
step
irá colocá-lo dentro do métodogenerate_products
, altura em que lhe será perguntado o que gostaria de fazer a seguir. -
você “pisou” no método
generate_products
comstep
acima, mas agora você decidiu que você quer saltar para o final do métodogenerated_products
sem o depurador pedir a sua escolha de comando de navegação após cada linha. Escrevafinish
para executar até que a actual estrutura da pilha tenha executado todas as linhas, fechado e devolvido um valor, emergindo assim por um nível, que está a voltar para a estrutura da pilha a partir da qual você já tinha saído. Seguindo o exemplo, isso o traz de volta ao métodoplace_on_sale
ao ponto depois que o interpretador avaliougenerated_products
. -
o comando seguinte executa a linha actual e move-se para a linha ou método seguinte no contexto actual, isto é, avançando sem mudar a estrutura da pilha. Dito de outra forma, continue uma linha abaixo do método atual sem ir mais fundo. Olhando para o exemplo de código, (e fingindo que tínhamos apenas reiniciado o nosso programa , execute
place_everything_on_sale
, e recentemente abriu um Levante de sessão), digitandonext
completamente executar o generate_products sem cair em suas partes internas, em seguida, ele irá atribuir o valor de retorno para o new_products variável. Nexts são maiores que passos, ou em termos de trilhos, um próximo passo has_many. Todo o código dentro do método generate_products (que de outra forma seriam muitas etapas), foi concluído com um único uso do comandonext
. Sua próxima decisão de navegação será se deve avançar, próximo anew_product.advertise
. -
abandone a sessão Pry e continue a execução do programa como normal com o comando
continue
. Se o intérprete encontrar outra ligação.a declaração pry, (que acontecerá quando você chamar o métodoplace_everyone_on_sale
acima), irá executar o método place_on_sale uma vez para cada vendedor, portanto, abrindo uma sessão Pry em cada iteração. Isto pode ser incrivelmente irritante, uma vez que o seu programa vai parar e você terá que navegar no depurador todas as vezes, então você provavelmente vai querer digitarexit-program
para cancelar o efeito de qualquer encadernação seguinte.declarações curiosas, sem, por assim dizer, sair do seu programa Rails. -
veja o código fonte do método que você está atualmente dentro:
whereami
ótimo para confirmar que você está na classe certa ou para ver onde você acabou depois de viajar através de alguns quadros em sua sessão de depuração. -
imprimir e navegar na pilha de chamadas quando uma exceção é levantada em Ruby, imprime um traço de pilha de todos os métodos chamados antes dessa exceção. Às vezes você quer ver o traço da pilha até agora, apesar de não haver nenhuma exceção levantada. Graças a uma extensão pry em particular instalada adicionando o
pry-stack_explorer
gem, você pode fazer isso comshow-stack -v
. Este comando emite o traço da pilha, indicando a moldura actual com uma seta. Você pode navegar para outra moldura com up ou ” up {n}”, Por exemplo, up 3 para ir para cima três frames, ou seja, mover o seu REPL para o contexto do método que chamou o método (e assim por diante…) que eventualmente chamou o método no qual você está atualmente colocado. Digiteshow-stack
para ver para onde você se moveu na pilha, e para baixo para mover os quadros na direção oposta. -
sair do contexto com um valor: Às vezes você quer manipular o fluxo do programa retornando um certo valor de uma sessão de Pry. Para um exemplo difícil, imagine que você tinha uma linha de código que lê
first_name = binding.pry
. A variável primeiro nome é atribuída a saída da sessão Pry, e você pode definir este valor para jack comexit "jack"
.
às vezes você quer especificar exatamente quando a ligação.O pry vai abrir uma sessão. Faço isto com condicionalismos de código Ruby:
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 debug Rails Rails Debugging with Pry If you don’t yet know what a debugging session is, think of it as opening the Rails console at a chosen in the execution path. presumo abaixo que tenha instalado o depurador Pry e as pedras preciosas pry-stack_explorer. em qualquer…
Part 3 in the series A Comprehensive Guide To debug Rails Rails Debugging with Pry If you don’t yet know what a debugging session is, think of it as opening the Rails console at a chosen in the execution path. presumo abaixo que tenha instalado o depurador Pry e as pedras preciosas pry-stack_explorer. em qualquer…