Xcode et débogage avancé dans LLDB: Partie 2

Bonjour, aujourd'hui, je porte à votre attention la deuxième partie de l'article sur le débogage des applications en LLDB.

Dans la première partie, nous avons compris comment utiliser les points d'arrêt dans Xcode pour modifier les propriétés existantes des variables et ajouter une ligne de code via les commandes d'instructions.

J'ai créé un projet de démonstration intentionnellement avec quelques erreurs afin de comprendre comment utiliser différents types de points d'arrêt dans LLDB pour déboguer l'application.

Si vous n'avez pas étudié la première partie de l'article, il est préférable de commencer par celle-ci. Permettez-moi de vous rappeler une règle importante de ce didacticiel: jusqu'à la fin de cet article, vous n'arrêtez pas le compilateur et ne redémarrez pas l'application après le tout premier lancement. Vous corrigez les erreurs lors de l'exécution du programme.

Points d'observation

Ainsi, l'erreur suivante dans l'application:

3. Vous pouvez charger des publications plus de 7 fois.

Comment reproduire l'erreur:

  • Activez Internet sur votre iPhone / simulateur
  • Faites défiler jusqu'à la fin du tableau pour charger plus de messages.
  • Vous pouvez charger des publications plus de 7 fois (bien que dans cette application, l'utilisateur ne devrait pas avoir une telle opportunité).

Comme l'une des options pour détecter les erreurs, vous devez savoir comment la variable entière pageNumber est mise à jour après le chargement de nouveaux messages sur la page. Comme vous ne connaissez toujours pas mon code, vous devez passer un peu de temps à comprendre ce qui s'y passe.

Ne t'inquiète pas. Appliquez de la magie.

De la première partie de l'article, nous avons appris que la requête HTTP GET est exécutée dans la section Networking de la marque pragma . Il contient exactement une fonction loadPosts . Placez un point d'arrêt sur la première ligne de cette fonction et faites glisser le tableau vers le bas pour mettre à jour. Le compilateur s'arrêtera à ce point d'arrêt.

image
Objectif-c

image
Rapide

Dans la fenêtre inférieure du débogueur, cliquez sur le bouton "Afficher les variables". Une nouvelle fenêtre apparaîtra sur la gauche, dans laquelle vous verrez toutes les variables PostsTableViewController.

image

Pointez le curseur sur pageNumber, faites un clic droit et sélectionnez «Watch _pageNumber» / «Watch pageNumber» pour Objective-C et Swift, respectivement.

image
Objectif-c

image
Rapide

Ainsi, vous avez créé le soi-disant point d'observation pour la variable pageNumber. Watchpoint est un type de point d'arrêt qui arrête le débogueur à chaque fois que la valeur de la variable définie est modifiée.

image
Objectif-c

image
Rapide

Continuez le programme. Le débogueur s'arrête et vous voyez quelque chose comme ceci:

Objectif-c

image

  1. Enregistre les anciennes et les nouvelles valeurs de la variable pageNumber .
  2. Suivi d'une pile de code qui modifie la valeur de la variable pageNumber .
  3. Le point actuel qui a provoqué la modification de la variable pageNumber est la méthode de définition de cette variable.

Si vous vous référez à l'étape 1 du suivi de pile, cela vous mènera à l'extrait de code suivant:

image

Rapide

image

  1. Le débogueur vous informe que le point d'observation que vous avez défini a révélé quelque chose.
  2. Suivi d'une pile de code qui modifie la valeur de la variable pageNumber .
  3. Le point actuel qui a provoqué la modification de la variable pageNumber est la fonction updateForNetworkCallEnd .

Il est logique de conclure que chaque fois après une requête HTTP GET réussie, la variable pageNumber est incrémentée de 1 jusqu'à ce que la variable d' état (du type enum) soit à l'état "actif". Cette variable peut avoir 2 états: actif («actif») ou inactif («inactif»). L'état «actif» signifie que l'utilisateur peut charger des publications (c'est-à-dire que la limite de 7 téléchargements n'a pas été atteinte). L'état «inactif», au contraire, suppose que l'utilisateur ne pourra plus charger de messages. Par conséquent, nous devons ajouter une logique à la fonction updateForNetworkCallEnd , qui vérifierait la variable pageNumber et définirait la variable d' état à l'état approprié.

Comme vous l'avez peut-être deviné, il est beaucoup plus facile de tester d'abord l'hypothèse sans arrêter le compilateur avant d'apporter des modifications au code.

Je note que dans la section Support de la marque pragma , nous avons déjà la fonction dont nous avons besoin ( setToInactiveState ), qui définit la variable d' état sur «inactive».
Ajoutez un point d'arrêt une ligne au-dessus de la condition if . Ajoutez également la commande d'instruction suivante au débogueur.

Objectif-c

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

image

Rapide

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


image

Après cela, supprimez le tout premier point d'arrêt que vous avez utilisé pour définir le point d'observation. Désactivez également le point de surveillance lui-même.

image
Objectif-c

image
Objectif-c

image
Rapide

image
Rapide

Faites maintenant défiler les tableaux, faites glisser vers le bas pour actualiser et commencer à retourner.
Tout a fonctionné! Mais il est trop tôt pour célébrer, nous avons encore un bug à corriger!

Et ensuite?

La troisième partie finale de l'article, dans laquelle nous découvrons un autre type de points d'arrêt - symboliques (points d'arrêt symboliques).

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


All Articles