Depurar instantâneos

Depois de implantar ou iniciar o app, você pode abrir o Stackdriver Debugger no Console do Google Cloud Platform. Com ele, você pode capturar e inspecionar a pilha de chamadas e as variáveis locais no app sem interrompê-lo ou deixá-lo lento.

Acesse a página Depuração do Console do GCP para usar o Google Stackdriver Debugger.

Antes de começar

O Stackdriver Debugger pode ser usado com ou sem acesso ao código-fonte do app. Se o código-fonte não estiver disponível, consulte a seção Capturar um instantâneo de depuração abaixo para ver instruções sobre como inserir manualmente o nome do arquivo e o número da linha.

Para acessar o código-fonte armazenado localmente ou em um repositório Git, talvez seja necessário selecionar um local do código-fonte.

Instantâneos

Os instantâneos do Stackdriver Debugger capturam as variáveis locais e a pilha de chamadas em um local de linha específico no código-fonte do app. Você pode especificar condições e locais para retornar um instantâneo dos dados do app e vê-lo em detalhes a fim de depurar o aplicativo.

Alguns segundos após você definir o local da linha de um instantâneo, ele é aplicado a todas as instâncias em execução do app. Na primeira vez que uma instância executa o código no local do instantâneo, o Stackdriver Debugger captura um instantâneo e o disponibiliza para visualização. A depuração implementa várias estratégias para minimizar a quantidade de latência causada ao capturar os dados.

Capturar um instantâneo de depuração

Console

Clique no número da linha do código-fonte para capturar um instantâneo no local.

  1. Verifique se o painel Instantâneo está selecionado no painel à direita.
  2. No painel à esquerda, selecione o arquivo que contém o código-fonte a ser analisado. O conteúdo do arquivo selecionado é exibido no painel central.
  3. Clique no número da linha em que está o local do código-fonte.

Navegar para o local de um instantâneo

É possível clicar em várias linhas para definir mais de um local do instantâneo em um arquivo.

Consulte a seção Opções de código-fonte para ver outras maneiras de carregar seu código-fonte no Stackdriver Debugger.

Se nenhum código-fonte estiver disponível, é possível inserir manualmente o "filename:line" para capturar um instantâneo no painel Instantâneo:

Definir o local de um instantâneo manualmente

gcloud

Para definir um local do instantâneo a partir da linha de comando:

gcloud debug snapshots create LOCATION

Em que:

  • LOCATION é o nome do arquivo e a linha em que foi definido o logpoint. O formato é FILE:LINE, em que FILE pode ser o nome do arquivo ou o nome do arquivo precedido de componentes de caminho suficientes para diferenciar o arquivo de outros arquivos com o mesmo nome. Forneça um nome de arquivo exclusivo no destino de depuração.

Condições do instantâneo (opcional)

Uma condição do instantâneo nada mais é do que uma expressão na linguagem do app (Java, Python e Go são compatíveis) que precisa ser avaliada como verdadeira para que o instantâneo seja capturado. As condições do instantâneo são avaliadas cada vez que a linha é executada, por qualquer instância, até que a condição seja avaliada como verdadeira ou até que o instantâneo expire.

O uso de condições do instantâneo é opcional.

A condição é uma expressão booleana completa que pode incluir operadores lógicos:

travelAccessory == “Towel”
ultimateAnswer <= 42
travelAccessory == “Towel” && ultimateAnswer <= 42

Console

Para especificar a condição, insira-a no campo Condição do painel Instantâneo.

Definir uma condição de instantâneo

gcloud

As condições são especificadas usando a sinalização --condition de snapshots create:

gcloud debug snapshots create LOCATION \
  --condition="ultimateAnswer <= 42 && foo==bar"

É possível usar os seguintes recursos de linguagem para expressar condições:

Java

A maioria das expressões do 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ância: this.counter == 20, this.myObj.isShutdown, myStatic ou com.mycompany.MyClass.staticMember.
  • Comparações de sequência com operador de igualdade: myString == "abc"
  • Chamadas de funções. Apenas as funções somente leitura podem ser usadas. Por exemplo: StringBuilder.indexOf() é compatível, mas StringBuilder.append() não é
  • Cast de tipo, com tipos totalmente qualificados: ((com.myprod.ClassImpl) myInterface).internalField

O seguinte recurso de linguagem não é compatível:

  • Conversão unboxing de tipos numéricos, como Integer. Em vez disso, use myInteger.value.

Python

A maioria das expressões do Python é compatível:
  • Leitura de variáveis locais e globais
  • Leitura de matrizes, listas, conjuntos, 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

A maioria das sintaxes de expressão do Go é compatível, incluindo:
  • 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 o recurso de expressões do Stackdriver Debugger, você pode avaliar expressões complexas ou transferir hierarquias de objeto quando um instantâneo é capturado. As expressões são compatíveis com os mesmos recursos de linguagem das condições do instantâneo descritas anteriormente.

O uso de expressões é opcional.

Usos comuns das expressões incluem:

  • Visualizar variáveis estáticas ou globais que não são parte do conjunto de variáveis locais.
  • Visualizar com mais facilidade as variáveis de membros aninhados sem precisar expandir toda vez a variável local no painel de depuração.
  • Evitar cálculos matemáticos repetitivos. Por exemplo, calcular a duração em segundos com (endTimeMillis - startTimeMillis) / 1000.0.

Como adicionar uma expressão:

Console

  1. Insira a expressão no campo Expressão. Pressione a tecla de espaço para adicionar mais expressões.
  2. Pressione a tecla "Enter" ou o botão Instantâneo Botão de instantâneo.

O resultado da expressão é mostrado quando o instantâneo é capturado.

Definir uma expressão

gcloud

As expressões são definidas usando a sinalização --expression de snapshots create:

gcloud debug snapshots create LOCATION \
  --expression="histogram.length"

Ver um instantâneo

Console

Os dados do instantâneo aparecem no Stackdriver Debugger quando o app executa o código-fonte no local especificado. Variáveis locais e da instância aparecem na seção Variáveis do painel. O rastreamento de pilhas aparece na seção Pilha de chamadas do painel.

Visualizar instantâneo

É possível examinar o valor das variáveis locais no momento em que o instantâneo 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.

Se vários locais de instantâneo tiverem sido definidos em um arquivo, ou se você quiser ver os instantâneos capturados, expanda o painel Histórico de instantâneos:

gcloud

Para recuperar o URL do Console do GCP referente a um instantâneo a partir da linha de comando:

gcloud debug snapshots list

STATUS  LOCATION                   CONDITION  COMPLETED_TIME  ID                  VIEW
ACTIVE  HighScoreService.java:105                             53bd97d4-b6c6-74fc  https://console.cloud.google.com/debug/fromgcloud?project=abc&dbgee=def&bp=ghi

Copie e cole o valor da coluna VIEW no seu navegador para ver o instantâneo no Console do GCP.

Para ver os dados detalhados do instantâneo a partir da linha de comando:

gcloud debug snapshots describe 53bb1240f371b-baa0-feb5d

O comando describe retorna o rastreamento da pilha e os valores das variáveis locais e tem como intenção principal ser legível por computador em vez de ser legível para humanos.

---
consoleViewUrl: https://console.cloud.google.com/debug/fromgcloud?project=1234&dbgee=gcp%3A1234%3A843aef0bd82301f7&bp=53bb1240f371b-baa0-feb5d
createTime: '2016-08-22T23:09:32.000Z'
finalTime: '2016-08-22T23:10:16.000Z'
id: 53bb1240f371b-baa0-feb5d
isFinalState: true
location: HighScoreService.java:105
stackFrames:
<... snip ...>

Recapturar instantâneo

Um instantâneo só é capturado uma vez. Se você quiser capturar outro instantâneo dos dados do app no mesmo local, faça isso manualmente.

Console

Para capturar um instantâneo novamente, clique no ícone da câmera na parte superior direita do painel Instantâneos:

Botão de instantâneo

O novo instantâneo é adicionado ao painel Histórico de instantâneos. Os instantâneos anteriores daquela linha podem ser acessados no Histórico de instantâneos ou no marcador do número da linha:

Instantâneos anteriores no marcador da linha

gcloud

Para recapturar o instantâneo a partir da linha de comando, repita o comando create originalmente usado:

gcloud debug snapshots create LOCATION

Remover um local do instantâneo

Console

Para remover um local do instantâneo, clique no "X" no marcador no instantâneo.

Ícone do instantâneo

gcloud

Para excluir um instantâneo a partir da linha de comando:

gcloud debug snapshots delete (ID | LOCATION-REGEXP)

Em que:

  • ID é o valor retornado por gcloud debug snapshots list;

  • LOCATION-REGEXP é a expressão regular que define o local do código dos instantâneos.

Compartilhar instantâneos

É possível compartilhar um instantâneo com outro membro do projeto. Basta copiar o URL do instantâneo do navegador ou da saída do comando gcloud debug snapshots list e informá-lo a outro usuário que tenha acesso ao projeto. Também é possível salvar esse URL para referências futuras e para consultá-lo novamente para ver os resultados. O Stackdriver Debugger usa um novo URL para cada instantâneo capturado. Isso permite compartilhar diferentes conjuntos de resultados, ainda que sejam capturados no mesmo local no código. O compartilhamento expira 30 dias após a captura do instantâneo.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Stackdriver Debugger