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
- 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.
-
No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.
-
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.
- Instale a CLI do Google Cloud.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
-
No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.
-
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.
- Instale a CLI do Google Cloud.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
- 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.
Clone o app no seu computador local:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Navegue até o diretório que contém o app:
cd python-docs-samples/appengine/standard_python3/cloud_debugger
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.
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.
Clique em Enviar.
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.
Acesse a página Depuração no Console do Google Cloud:
Verifique se o projeto correto está selecionado:
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:
Verifique se a versão correta do seu 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.
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".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 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.
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.
Para inserir um logpoint, selecione a guia Logpoint.
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 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.
Para verificar se o logpoint foi injetado com êxito, selecione a guia Histórico de logpoint.
Para acionar o logpoint, atualize a página.
Para ver os registros gerados pelo logpoint, selecione o painel Registros e clique no botão de atualizar refresh.
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.
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.
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 camera_alt para preparar o Debugger para o snapshot.Atualize a página para acionar o snapshot. O painel Variáveis mostra que a variável
left
é maior queright
.Como a variável
left
já é maior queright
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.
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]
.
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.
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.
Navegue até a página Projetos do console do Google Cloud.
Clique em Excluir delete ao lado de seu projeto.
Digite o nome do seu projeto para confirmar o encerramento.
A seguir
Leia nossos recursos sobre DevOps e conheça nosso programa de pesquisa.