Depois de configurar a depuração no Cloud Debugger e implantar ou iniciar o app, é possível tirar ou visualizar snapshots de depuração no console de origem.
Visão geral dos snapshots
Os snapshots capturam variáveis locais e a pilha de chamadas em um local de linha específico no código-fonte do seu aplicativo. É possível retornar um snapshot do estado do seu aplicativo com base nas condições e nos locais de linha especificados. Os detalhes do snapshot podem ajudar você a depurar seu código.
Alguns segundos depois de definir o local da linha, as configurações do snapshot são aplicadas a todas as instâncias em execução do aplicativo. Na primeira vez que uma instância executar o código no local do snapshot, o Debugger o captura e o disponibilizará para visualização. O Debugger implementa várias estratégias para minimizar a latência causada ao capturar dados.
Os snapshots podem não estar disponíveis durante a inicialização, enquanto o debugador é inicializado.
Capturar um snapshot de depuração
No Console do Google Cloud, abra o Cloud Source Repositories.
Abra o Cloud Source Repositories
A página Todos os repositórios é aberta. Se preferir, abra a visualização Minha origem.
Clique no nome de um repositório e acesse o arquivo que contém o código-fonte que você quer assistir.
Clique no número de linha em que está o local do código-fonte.
Quando solicitado, selecione o aplicativo que você quer depurar e clique em Continuar.
Clique em Criar snapshot.
O novo snapshot aparece em um painel adjacente do Console do Google Cloud.
Condições do snapshot (opcional)
Uma condição do snapshot é uma expressão que precisa ser avaliada como true
para que ele seja capturado. As expressões em Java, Python e Go são compatíveis.
As condições do snapshot são avaliadas sempre que uma instância executa a linha até que a condição seja avaliada como true
ou até que o snapshot expire.
A condição é uma expressão booleana completa que pode incluir operadores lógicos:
travelAccessory == "Towel"
ultimateAnswer <= 42
travelAccessory == "Towel" && ultimateAnswer <= 42
Definir uma condição de snapshot
No Console do GCP, clique na guia Snapshot e selecione um deles.
Depois que o painel do Snapshot abrir, clique Editar snapshot.
No campo Condição, insira a condição do snapshot.
Clique em Atualizar.
É possível usar os recursos de linguagem a seguir para expressar condições:
Java
A maioria das expressões em Java é compatível, incluindo as seguintes:- Variáveis locais:
a == 8
. - Operações numéricas e booleanas:
x + y < 20
- Campos estáticos e de instâncias:
this.counter == 20
,this.myObj.isShutdown
,myStatic
oucom.mycompany.MyClass.staticMember
. - Comparações de strings com o operador de igualdade:
myString == "abc"
. - Chamadas de funções. Apenas as funções somente leitura podem ser usadas. Por exemplo,
StringBuilder.indexOf()
é compatível, masStringBuilder.append()
não é. - Transmissão de tipo, com tipos totalmente qualificados:
((com.myprod.ClassImpl) myInterface).internalField
.
Os seguintes recursos de linguagem não são compatíveis:
- Unboxing de tipos numéricos, como
Integer
; usemyInteger.value
Python
A maioria das expressões em Python é compatível, incluindo as seguintes:- Leitura de variáveis locais e globais
- Leitura de matrizes, listas, frações, dicionários e objetos
- Execução de métodos simples
Os seguintes recursos de linguagem não são compatíveis:
- Execução de funções que alocam novos objetos ou usam executores complexos
- Criação de novos objetos dentro da expressão
Go (Beta)
A maioria das sintaxes de expressão em Go é compatível, incluindo estas:- Leitura de variáveis locais e globais
- Leitura de matrizes, conjuntos, mapas e structs
Os seguintes recursos de linguagem não são compatíveis:
- Leitura a partir de valores da interface
- Inserir conversões e literais compostos
- Chamadas de funções diferentes de
len
Expressões (opcional)
Com as expressões de snapshot, é possível avaliar expressões complexas ou atravessar hierarquias de objetos quando um snapshot é tirado. As expressões são compatíveis com os mesmos recursos de linguagem das condições do snapshot descritas anteriormente.
Veja a seguir os usos comuns para expressões:
Visualizar variáveis estáticas ou globais que não fazem parte do conjunto de variáveis locais.
Visualizar variáveis de membro profundamente aninhadas sem precisar expandir uma variável local no painel do depurador toda vez.
Evitar cálculos matemáticos repetitivos. Por exemplo, calcular uma duração em segundos com
(endTimeMillis - startTimeMillis) / 1000.0
.
Adicionar uma expressão
No painel inferior do Console do GCP, clique na guia Snapshot e selecione um deles.
No painel que é aberto, clique em Editar snapshot.
No campo Expressão, insira a expressão.
Se você quiser adicionar expressões, pressione a tecla Tab.
Clique em Atualizar.
Visualizar um snapshot
Os dados do snapshot aparecem no console de origem depois que o aplicativo executa o código no local especificado.
No painel inferior do Console do GCP, clique na guia Snapshot e selecione um deles.
Um painel com os detalhes do snapshot exibe valores de variáveis de instância e o rastreamento de pilha no local do código do snapshot.
É possível examinar o valor das variáveis locais no momento em que o snapshot foi capturado e detalhar estruturas de dados mais profundas. Também é possível clicar em qualquer frame de pilha de chamada e analisar as variáveis locais naquele nível da pilha.
Recapturar snapshot
Um snapshot só é capturado uma vez. Para capturar outro snapshot do estado do aplicativo no mesmo local, siga estas etapas:
No painel Snapshots do Console do GCP, mantenha o ponteiro do mouse sobre o snapshot.
Clique em Recapturar.
Remover um local de snapshot
No painel Snapshots do Console do GCP, mantenha o ponteiro do mouse sobre o snapshot.
Clique em Excluir delete.
Compartilhar snapshots
Para compartilhar um snapshot, compartilhe o URL dele no seu navegador. Também é possível salvar esse URL para referências futuras e para consultá-lo novamente para ver os resultados. O Debugger usa um novo URL para cada snapshot capturado. Isso permite que você compartilhe conjuntos distintos de resultados, mesmo que eles tenham sido capturados no mesmo local no código.