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étodo generate_products, altura em que lhe será perguntado o que gostaria de fazer a seguir.

  • você “pisou” no método generate_products com step acima, mas agora você decidiu que você quer saltar para o final do método generated_products sem o depurador pedir a sua escolha de comando de navegação após cada linha. Escreva finish 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étodo place_on_sale ao ponto depois que o interpretador avaliou generated_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), digitando next 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 comando next. Sua próxima decisão de navegação será se deve avançar, próximo a new_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étodo place_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 digitar exit-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 com show-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. Digite show-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 com exit "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…

Deixe uma resposta

O seu endereço de email não será publicado.