Guia de início rápido: depure um app em Python usando o Cloud Debugger

Depurar um app Python usando o Cloud Debugger

Neste guia de início rápido, mostramos como usar o Cloud Debugger para depurar o estado de um aplicativo simples em Python em execução no App Engine. Você aprenderá a realizar estas ações:

  • Inspecionar as variáveis locais e a pilha de chamadas.
  • Criar instruções de geração de registro.
  • Definir condições de snapshot e usar expressões.

Antes de começar

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud. Saiba como verificar se o faturamento está ativado em um projeto.

  4. Instale a CLI do Google Cloud.
  5. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  6. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  7. Verifique se a cobrança está ativada para o seu projeto do Google Cloud. Saiba como verificar se o faturamento está ativado em um projeto.

  8. Instale a CLI do Google Cloud.
  9. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  10. Verifique se os software a seguir estão instalados no seu sistema local:

Implantar um app de amostra no App Engine

Comece implantando um app Python 3.7 no App Engine.

  1. Clone o app no seu computador local:

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    
  2. Navegue até o diretório que contém o app:

    cd python-docs-samples/appengine/standard_python3/cloud_debugger
    
  3. Implante o aplicativo no App Engine por meio deste comando:

    gcloud app deploy
    

    Quando solicitado, selecione a região em que você quer que seu aplicativo do App Engine esteja localizado.

  4. Para ver o app, digite o seguinte comando:

    gcloud app browse
    

    Se uma janela do navegador não abrir automaticamente exibindo o aplicativo, clique no URL que aparece no terminal.

    O app contém uma solicitação para inserir uma string com o campo já preenchido.

    O app de exemplo mostra um botão "Enviar" e o campo já preenchido com abcd.

  5. Clique em Enviar.

    A saída do app de amostra exibe dois resultados: a saída do programa e a saída correta.

Você verá dois resultados depois de clicar em "Enviar". Um é rotulado como Saída do programa e mostra a saída do método Reverse no código-fonte. Já o outro é rotulado como Saída correta, que é a saída da funcionalidade de lista inversa do Python.

A Saída do Programa e a Saída correta precisam ser idênticas. No entanto, há um problema com o código-fonte. Use o Debugger para diagnosticá-lo.

Ver o código-fonte implantado

Depois de implantar o app, é possível visualizar o código-fonte implantado na página Depuração do console do Google Cloud.

  1. Acesse a página Depuração no Console do Google Cloud:

    Acessar a página de depuração

  2. Verifique se o projeto correto está selecionado:

    O menu suspenso destacado do seletor de projetos mostra que o projeto correto está selecionado.

  3. Para confirmar se o Debugger tem acesso aos arquivos implantados, verifique se os arquivos implantados estão selecionados e se os arquivos do app estão presentes:

    O menu suspenso mostra que os arquivos implantados estão selecionados.

  4. Verifique se a versão correta do seu app está selecionada:

    O menu suspenso mostra que a versão correta do app está selecionada.

    O App Engine mantém todas as versões implantadas de um aplicativo. Ao usar o Debugger, verifique se a versão correta do app está selecionada.

    Depois de selecionar o arquivo main.py, você verá o seguinte bloco de código:

    try:
      import googleclouddebugger
      googleclouddebugger.enable()
    except ImportError:
       pass
    
    import logging
    logging.basicConfig(level=logging.INFO)
    

    Nesta seção, o agente do Debugger é importado e ativado por meio de um bloco de tentativa e exceção :

    try:
      import googleclouddebugger
      googleclouddebugger.enable()
    except ImportError:
       pass
    
    Esta seção configura a geração de registros:

    import logging
    logging.basicConfig(level=logging.INFO)
    

Agora você está pronto para capturar snapshots de depuração e injetar logpoints de depuração para diagnosticar o problema no código-fonte.

Capturar um snapshot de depuração

Um snapshot de depuração captura as variáveis locais e a pilha de chamadas que estão no escopo em um local de linha.

  1. Para capturar um snapshot de depuração, clique no número de linha que contém a variável tmp. Uma seta azul é exibida indicando que um snapshot está definido, e o painel de resultados exibe "Aguardando snapshot ser acionado".

    A interface do depurador mostra que um snapshot foi definido na linha 47.

  2. Para acionar seu snapshot, atualize a página.

    O painel Variáveis mostra os valores das variáveis. Veja que a matriz chars foi preenchida corretamente na primeira passagem pelo loop. O problema não está presente aqui porque o snapshot foi capturado na primeira vez em que o ponto de interrupção foi atingido.

    O painel de resultados mostra os valores das variáveis após a captura do snapshot.

    O painel Pilha de chamadas mostra os resultados da pilha de chamadas. Clique nas funções desse painelpara ver os parâmetros e variáveis locais nesse ponto no código. Ao clicar em ReverseString, você verá que a entrada estava correta.

    O painel de resultados mostra os valores da pilha de chamadas após a captura do snapshot.

Como capturar um snapshot e inspecionar as variáveis e a pilha de chamadas não revelou o problema, use os logpoints para detectá-lo.

Injetar um logpoint de depuração

Um logpoint de depuração permite que você injete a geração de registros no app em execução sem reiniciá-lo.

  1. Para inserir um logpoint, selecione a guia Logpoint.

  2. Clique no número da linha que contém a variável tmp. Uma caixa de texto in-line é exibida. Preencha os campos da maneira a seguir e clique em Adicionar:

    if (True) logpoint("About to swap two characters. Chars is currently {chars}")
    

    Um logpoint é definido na linha 47.

    Um logpoint tem esta estrutura: if(condition)logpoint(string). Para criar um, você tem que fornecer duas partes:

    • Uma condição, que precisa ser escrita na sintaxe do código-fonte.

    • Uma string, que pode conter qualquer número de expressões, em chaves, escritas na sintaxe do código-fonte.

  3. Para verificar se o logpoint foi injetado com êxito, selecione a guia Histórico de logpoint.

    A guia "Histórico de logpoint" mostra que um logpoint foi definido na linha 18.

  4. Para acionar o logpoint, atualize a página.

  5. Para ver os registros gerados pelo logpoint, selecione o painel Registros e clique no botão de atualizar .

    A guia "Registros" mostra o resultado do logpoint.

Como diagnosticar o problema

Os logpoints indicam que o loop while é executado três vezes, mas só precisa ser executado duas vezes. Como o logpoint é definido no início do loop, ele registrou que estava prestes a trocar caracteres em uma string que já estava totalmente invertida.

Os registros mostram que o loop while foi executado três vezes.

Para identificar o problema, use um snapshot de depuração com uma condição.

Capturar um snapshot de depuração usando uma condição

O app usa as variáveis left e right para detectar quando interromper a troca de valores. Quando a variável left é maior que a variável right, o loop precisa ser encerrado.

Os snapshots podem ser definidos para serem acionados com base em uma condição no código-fonte. Como você sabe quando o loop precisa ser encerrado, use um snapshot com uma condição para isolar o problema.

  1. Para determinar o motivo de o loop ser executado tantas vezes, defina o snapshot para ser acionado nesta condição: left > right. Depois, clique no ícone para preparar o Debugger para o snapshot.

    Um snapshot é definido na linha 47 usando uma instrução condicional.

  2. Atualize a página para acionar o snapshot. O painel Variáveis mostra que a variável left é maior que right.

    Como a variável left já é maior que right neste ponto do loop, isso significa que, à medida que o loop continuar, ele trocará os valores mais uma vez antes de atingir a linha 50 e ser encerrado.

    O painel "Variáveis" mostra os valores das variáveis.

Capturar um snapshot de depuração usando uma expressão

O Debugger também permite recuperar expressões de linguagem de programação quando o snapshot é acionado. Por exemplo, é possível recuperar os valores na matriz chars com expressões como chars[1] e chars[2].

  1. Para conseguir o valor de uma expressão quando um snapshot for acionado, grave a expressão no campo Expressão. É possível inserir várias expressões.

    Após os acionadores de snapshot, os valores de expressão aparecem acima do painel Variáveis.

    Os resultados do campo de expressão mostram os valores c e b.

Como corrigir o problema

Os snapshots e os logpoints ajudam a diagnosticar o problema no app. Neste exemplo, o loop while é executado muitas vezes porque a instrução que o interrompe, if left >= right: break, é atingida muito tarde para interromper a última iteração. Para corrigir o problema, mova if left >= right: break da linha 50 para a linha 47.

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados nesta página, siga estas etapas.

  1. Navegue até a página Projetos do console do Google Cloud.

  2. Clique em Excluir ao lado de seu projeto.

  3. Digite o nome do seu projeto para confirmar o encerramento.

A seguir