Xcode e depuração avançada no LLDB: parte 2

Boa tarde, hoje trago a atenção para a segunda parte do artigo sobre aplicativos de depuração no LLDB.

Na primeira parte, descobrimos como usar pontos de interrupção no Xcode para modificar as propriedades existentes das variáveis ​​e adicionar uma linha de código através de comandos de instrução.

Criei intencionalmente um projeto de demonstração com alguns erros para descobrir como usar diferentes tipos de pontos de interrupção no LLDB para depurar o aplicativo.

Se você não estudou a primeira parte do artigo, é melhor começar com ele. Deixe-me lembrá-lo de uma regra importante deste tutorial: Até o final deste artigo, você não para o compilador e não reinicia o aplicativo após o primeiro lançamento. Você corrige erros durante a execução do programa.

Pontos de controle

Portanto, o seguinte erro no aplicativo:

3. Você pode carregar postagens mais de 7 vezes.

Como reproduzir o erro:

  • Ligue a Internet no seu iPhone / simulador
  • Role até o final da tabela para carregar mais postagens.
  • Você pode carregar postagens mais de 7 vezes (embora, neste aplicativo, o usuário não deva ter essa oportunidade).

Como uma das opções para detectar erros, você precisa descobrir como a variável inteira pageNumber é atualizada após o carregamento de novas postagens na página. Como você ainda não está familiarizado com o meu código, você precisa dedicar algum tempo para entender o que está acontecendo nele.

Não se preocupe. Aplique um pouco de mágica.

Desde a primeira parte do artigo, aprendemos que a solicitação GET HTTP é executada na seção Rede de marca pragma . Ele contém exatamente uma função loadPosts . Coloque um ponto de interrupção na primeira linha desta função e arraste a tabela para baixo para atualizar. O compilador irá parar nesse ponto de interrupção.

imagem
Objetivo-c

imagem
Swift

Na janela inferior do depurador, clique no botão "Mostrar variáveis". Uma nova janela aparecerá à esquerda, na qual você verá todas as variáveis ​​PostsTableViewController.

imagem

Aponte o cursor para pageNumber, clique com o botão direito do mouse e selecione “Watch _pageNumber” / “Watch pageNumber” para Objective-C e Swift, respectivamente.

imagem
Objetivo-c

imagem
Swift

Assim, você criou o chamado ponto de controle para a variável pageNumber. O ponto de controle é um tipo de ponto de interrupção que interrompe o depurador toda vez que o valor da variável é definido como alterado.

imagem
Objetivo-c

imagem
Swift

Continue o programa. O depurador para e você vê algo como o seguinte:

Objetivo-c

imagem

  1. Registra valores antigos e novos da variável pageNumber .
  2. Rastreando uma pilha de código que altera o valor da variável pageNumber .
  3. O ponto atual que causou a alteração da variável pageNumber é o método setter dessa variável.

Se você se referir à etapa 1 no rastreamento de pilha, ela o levará ao seguinte snippet de código:

imagem

Swift

imagem

  1. O depurador informa que o ponto de observação que você definiu revelou algo.
  2. Rastreando uma pilha de código que altera o valor da variável pageNumber .
  3. O ponto atual que causou a alteração da variável pageNumber é a função updateForNetworkCallEnd .

É lógico concluir que toda vez após uma solicitação HTTP GET bem-sucedida, a variável pageNumber é incrementada em 1 até que a variável de estado (do tipo enum) esteja no estado "ativo". Essa variável pode ter 2 estados: ativo ("ativo") ou inativo ("inativo"). O estado "ativo" significa que o usuário pode carregar postagens (ou seja, o limite de 7 downloads não foi atingido). O estado "inativo", pelo contrário, pressupõe que o usuário não poderá mais carregar postagens. Como resultado, precisamos adicionar lógica à função updateForNetworkCallEnd , que verificaria a variável pageNumber e definiria a variável state para o estado apropriado.

Como você deve ter adivinhado, é muito mais fácil testar a hipótese primeiro sem parar o compilador antes de fazer alterações no código.

Observo que na seção Suporte da marca pragma já temos a função de que precisamos ( setToInactiveState ), que define a variável de estado como "inativa".
Adicione um ponto de interrupção uma linha acima da condição if . Adicione também o seguinte comando de instrução ao depurador.

Objetivo-c

expression if (self.pageNumber >= 7) {[self setToInactiveState]} 

imagem

Swift

 expression if (self.pageNumber >= 7) {setToInactiveState()} 


imagem

Depois disso, exclua o primeiro ponto de interrupção usado para definir o ponto de observação. Desative também o próprio ponto de controle.

imagem
Objetivo-c

imagem
Objetivo-c

imagem
Swift

imagem
Swift

Agora role as tabelas para cima, arraste para baixo para atualizar e começar a virar.
Tudo deu certo! Mas é muito cedo para comemorar, ainda temos um bug para corrigir!

O que vem a seguir?

A terceira parte final do artigo, na qual aprendemos sobre outro tipo de pontos de interrupção - simbólico (pontos de interrupção simbólicos).

Source: https://habr.com/ru/post/pt432122/


All Articles