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

Bonjour, aujourd'hui, je vous suggÚre de vous familiariser avec la traduction d'un article sur le débogage des applications iOS à l'aide de LLDB.

L'une des parties les plus intrigantes de la prĂ©sentation de la WWDC 2018, Xcode et le dĂ©bogage avancĂ© en LLDB, a Ă©tĂ© introduite par les ingĂ©nieurs d'Apple. Ils ont donnĂ© quelques conseils utiles sur la façon d'utiliser les points d'arrĂȘt dans Xcode et le dĂ©bogueur de bas niveau (LLDB) pour optimiser le processus de dĂ©bogage des bogues, oĂč que le dĂ©veloppeur les ait dĂ©tectĂ©s.

L'article se compose de trois parties, nous allons passer en revue les principaux points qui ont Ă©tĂ© Ă©noncĂ©s Ă  la WWDC. J'ai crĂ©Ă© un projet de dĂ©monstration spĂ©cifiquement pour mieux comprendre comment utiliser diffĂ©rents types de points d'arrĂȘt (points d'arrĂȘt) en conjonction avec LLDB pour capturer et dĂ©boguer des bogues dans votre application.

Projet de démonstration

J'ai créé un projet de tùche modÚle que chaque développeur iOS a rencontré d'une maniÚre ou d'une autre. Il est trÚs important de comprendre comment cela fonctionne avant de plonger dans la lecture de l'article. Voici les principales fonctions du projet de démonstration:

  • Lorsqu'il est ouvert, nous voyons un contrĂŽleur de vue de table qui charge une liste de publications.
  • Lors du dĂ©filement vers le bas, le contrĂŽleur de vue de table charge de nouveaux messages.
  • Au total, vous pouvez charger des publications 7 fois .
  • Vous pouvez mettre Ă  jour la liste des publications en tirant vers le bas Ă  l'aide du contrĂŽleur de rafraĂźchissement (tirez vers le bas pour rafraĂźchir).
  • Dans la barre de navigation en haut, il y a 2 Ă©tiquettes (Ă©tiquettes) qui montrent combien de messages ont Ă©tĂ© tĂ©lĂ©chargĂ©s (Ă©tiquette de droite) et combien de fois l'utilisateur a dĂ©jĂ  tĂ©lĂ©chargĂ© des messages (Ă©tiquette de gauche).

Vous pouvez télécharger le projet de démonstration à partir d'ici si vous préférez Objective-C.

Si vous préférez Swift, alors à partir d'ici .

Lancez Xcode et c'est parti!

Bugs Ă  corriger!

Vous vous ĂȘtes donc familiarisĂ© avec le projet et avez probablement remarquĂ© les erreurs suivantes:

  • Lorsque vous tirez la table vers le bas, le rafraĂźchisseur ne met pas Ă  jour les messages.
  • L'utilisateur ne reçoit aucune notification (Ă  l'aide du contrĂŽleur d'alerte) indiquant que la demande HTTP n'a pas Ă©tĂ© exĂ©cutĂ©e en raison de problĂšmes de connexion.
  • Vous pouvez charger des publications plus de 7 fois.
  • L'indicateur de gauche (Ă©tiquette) dans la barre de navigation, qui est responsable du comptage du nombre de tĂ©lĂ©chargements, ne fonctionne pas.

Une rĂšgle importante: 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.

Le pouvoir des équipes pédagogiques

Passons au premier bug.

1. Lorsque vous tirez le tableau vers le bas, les messages ne sont pas mis Ă  jour.

Comment reproduire l'erreur:

  • Lancez l'application, les 10 premiers messages sont dĂ©jĂ  chargĂ©s.
  • Faites dĂ©filer vers le bas pour charger plus de messages.
  • Faites dĂ©filer jusqu'au dĂ©but du tableau et faites-le glisser pour actualiser.
  • Les nouveaux messages ne se chargent pas et les anciens ne disparaissent pas, et le compteur de messages n'est pas rĂ©initialisĂ©.

L'approche standard pour corriger de telles erreurs consiste Ă  examiner ce qui se passe Ă  l'intĂ©rieur du sĂ©lecteur de mĂ©thode responsable de l'UIRefreshControl de notre table. AccĂ©dez Ă  PostsTableViewController dans la section de prise en charge du contrĂŽle de rafraĂźchissement de la marque pragma . À partir de la fonction setupRefreshControl, nous pouvons conclure que le sĂ©lecteur responsable de la mise Ă  jour des publications est la fonction reloadNewPosts . Ajoutons un point d'arrĂȘt Ă  la premiĂšre ligne de cette fonction et dĂ©couvrons ce qui se passe exactement ici. Faites maintenant dĂ©filer jusqu'au dĂ©but du tableau et faites glisser l'Ă©cran pour actualiser.

image
Objectif-c

image
Rapide

Le dĂ©bogueur s'est arrĂȘtĂ© au point d'arrĂȘt que vous avez dĂ©fini. Pour une Ă©tude plus approfondie, cliquez sur le bouton «sauter le bloc» du dĂ©bogueur.

image
Objectif-c

image
Rapide

Maintenant, nous comprenons ce qui ne va pas!

La condition if n'est pas remplie (c'est-à-dire que la variable booléenne isPullDownToRefreshEnabled est définie sur NO) et, par conséquent, le code de mise à jour des publications est ignoré.

L'approche standard consiste Ă  arrĂȘter le compilateur, puis vous devez dĂ©finir isPullDownToRefreshEnabled sur YES / true et cela rĂ©soudrait le problĂšme. Mais il serait beaucoup plus pratique de tester d'abord notre hypothĂšse avant d'apporter des modifications au code et sans avoir Ă  arrĂȘter le compilateur. C'est lĂ  que les commandes d'instruction du dĂ©bogueur s'avĂšrent trĂšs utiles.

Double-cliquez sur le point d'arrĂȘt installĂ© ou faites un clic droit sur «Modifier le point d'arrĂȘt» et cliquez sur le bouton «Ajouter une action». SĂ©lectionnez Ă©galement le type d'action «Commande du dĂ©bogueur».

image

Maintenant, nous devons définir la propriété isPullDownToRefreshEnabled sur YES / true. Ajoutez la commande suivante au débogueur.

Objectif-c

expression self.isPullDownToRefreshEnabled = YES 


image

Rapide

 expression self.isPullDownToRefreshEnabled = true 

image

Ensuite, vĂ©rifiez que la case «Continuer automatiquement aprĂšs l'Ă©valuation des actions» est cochĂ©e. Il est chargĂ© de s'assurer que le dĂ©bogueur ne s'arrĂȘte pas au point d'arrĂȘt Ă  chaque fois et continue automatiquement de travailler avec la commande nouvellement ajoutĂ©e. Faites maintenant dĂ©filer jusqu'au dĂ©but du tableau et faites glisser vers le bas pour actualiser.

Voila, les nouveaux messages ont chargé et remplacé les anciens et, en conséquence, le compteur de messages a été mis à jour.

Nous avons résolu le premier problÚme, procurez-vous votre arme anti-bug, nous passons au second.

2. L'utilisateur ne reçoit aucune notification (à l'aide du contrÎleur d'alerte) indiquant que la demande HTTP n'a pas été exécutée en raison de problÚmes de connexion.

Comment reproduire l'erreur:

  • DĂ©connectez la connexion Internet de votre iPhone / simulateur.
  • Faites dĂ©filer jusqu'au dĂ©but du tableau et faites glisser vers le bas pour actualiser.
  • Les nouveaux messages ne seront pas tĂ©lĂ©chargĂ©s en raison d'une erreur de connexion Internet.
  • L'utilisateur ne reçoit aucune notification d'erreur.

AccĂ©dez Ă  PostsTableViewController dans la section Networking de la marque pragma . Il a exactement une fonction loadPosts . Il utilise une instance de gestionnaire de rĂ©seau commune pour exĂ©cuter une requĂȘte HTTP GET qui renvoie un tableau de publications via un gestionnaire de fin «succĂšs» ou NSError via un gestionnaire de fin «échec».

Nous devons ajouter le code à la fermeture «infructueuse» afin d'afficher un contrÎleur d'alerte. Si vous accédez à la section Support de la marque pragma, vous verrez qu'il existe déjà une fonction presentNetworkFailureAlertController chargée d'afficher le contrÎleur d'alerte souhaité. Tout ce que nous devons faire est d'appeler cette fonction dans une fermeture "échouée" dans loadPosts .
La maniĂšre traditionnelle consiste Ă  arrĂȘter le simulateur et Ă  ajouter le code souhaitĂ©. Allons dans l'autre sens!

Ajoutez un point d'arrĂȘt Ă  l'intĂ©rieur de la fermeture «infructueuse» aprĂšs la ligne

Objectif-c

 [self updateUIForNetworkCallEnd]; 

Rapide

 self.updateUIForNetworkCallEnd() 

Double-cliquez sur le point d'arrĂȘt installĂ© ou faites un clic droit sur «Modifier le point d'arrĂȘt» et cliquez sur le bouton «Ajouter une action». SĂ©lectionnez Ă©galement le type d'action «Commande du dĂ©bogueur».

Ajoutez la commande suivante au débogueur.

Objectif-c

 expression [self presentNetworkFailureAlertController] 

image

Rapide

 expression self.presentNetworkFailureAlertController() 

image

Vérifiez que la case «Continuer automatiquement aprÚs l'évaluation des actions» est cochée.
Avec Internet désactivé, faites défiler jusqu'au début du tableau et faites glisser vers le bas pour mettre à jour, ou vous pouvez faire défiler jusqu'à la fin du tableau et essayer de charger de nouveaux messages. Voici ce que vous verrez:

image

Ce que nous venons de faire s'appelle « injecter » le code Ă  l'aide d'une commande ajoutĂ©e au dĂ©bogueur Ă  un point d'arrĂȘt spĂ©cifique.

Un petit résumé

ÉnumĂ©rons encore une fois ce que nous pouvons faire avec les commandes de dĂ©bogage ajoutĂ©es au point d'arrĂȘt:

  • Fonctionne avec une valeur de propriĂ©tĂ© existante.
  • Ajoutez une nouvelle ligne de code.

Les deux tĂąches ont Ă©tĂ© effectuĂ©es pendant l'exĂ©cution du programme. Nous n'avons essentiellement pas besoin d'arrĂȘter le compilateur pour corriger les erreurs et redĂ©marrer l'application.

Et ensuite?

De plus, j'attire votre attention sur la deuxiĂšme partie de l'article , oĂč nous corrigerons davantage d'erreurs et dĂ©couvrirons un autre type de point d'arrĂȘt (point d'arrĂȘt) - le point d'observation (point d'observation).

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


All Articles