Xcode und erweitertes Debugging in LLDB: Teil 1

Guten Tag, heute schlage ich vor, dass Sie sich mit der Übersetzung eines Artikels über das Debuggen von iOS-Anwendungen mit LLDB vertraut machen.

Einer der faszinierendsten Teile der WWDC 2018-Präsentation, Xcode und erweitertes Debugging in LLDB, wurde von Apple-Ingenieuren eingeführt. Sie gaben einige nützliche Tipps zur Verwendung von Haltepunkten in Xcode und Low-Level-Debugger (LLDB), um den Prozess des Debuggens von Fehlern zu optimieren, wo immer der Entwickler sie abfing.

Der Artikel besteht aus drei Teilen. Wir werden die wichtigsten Punkte durchgehen, die auf der WWDC gesagt wurden. Ich habe speziell ein Demo-Projekt erstellt, um zu verstehen, wie verschiedene Arten von Haltepunkten (Haltepunkten) in Verbindung mit LLDB zum Erfassen und Debuggen von Fehlern in Ihrer Anwendung verwendet werden.

Demo-Projekt

Ich habe ein Vorlagenaufgabenprojekt erstellt, das jeder iOS-Entwickler auf die eine oder andere Weise getroffen hat. Es ist sehr wichtig zu verstehen, wie es funktioniert, bevor Sie sich mit dem Lesen des Artikels befassen. Hier sind die Hauptfunktionen des Demo-Projekts:

  • Beim Öffnen sehen wir einen Tabellenansichts-Controller, der eine Liste von Posts lädt.
  • Beim Scrollen nach unten lädt der Table View Controller neue Beiträge.
  • Insgesamt können Sie Beiträge 7 Mal laden.
  • Sie können die Liste der Beiträge aktualisieren, indem Sie sie mit dem Aktualisierungscontroller nach unten ziehen (zum Aktualisieren nach unten ziehen).
  • In der Navigationsleiste oben befinden sich 2 Labels (Labels), die anzeigen, wie viele Beiträge heruntergeladen wurden (rechtes Label) und wie oft der Benutzer bereits Beiträge hochgeladen hat (linkes Label).

Sie können das Demo-Projekt hier herunterladen , wenn Sie Objective-C bevorzugen.

Wenn Sie Swift bevorzugen, dann von hier aus .

Starten Sie Xcode und los geht's!

Fehler zu beheben!

Sie haben sich also mit dem Projekt vertraut gemacht und wahrscheinlich die folgenden Fehler festgestellt:

  • Beim Herunterziehen der Tabelle aktualisiert die Auffrischung die Beiträge nicht.
  • Der Benutzer erhält keine Benachrichtigung (mithilfe des Alert-Controllers), dass die HTTP-Anforderung aufgrund von Verbindungsproblemen nicht abgeschlossen wurde.
  • Sie können Beiträge mehr als 7 Mal laden.
  • Die linke Anzeige (Beschriftung) in der Navigationsleiste, die für die Zählung der Anzahl der Downloads verantwortlich ist, funktioniert nicht.

Eine wichtige Regel: Bis zum Ende dieses Artikels stoppen Sie den Compiler nicht und starten die Anwendung nach dem ersten Start nicht neu. Sie korrigieren Fehler während der Programmausführung.

Die Macht der Unterrichtsteams

Kommen wir zum ersten Fehler.

1. Wenn Sie die Tabelle nach unten ziehen, werden die Beiträge nicht aktualisiert.

So reproduzieren Sie den Fehler:

  • Starten Sie die Anwendung, die ersten 10 Beiträge sind bereits geladen.
  • Scrollen Sie nach unten, um weitere Beiträge zu laden.
  • Scrollen Sie zum Anfang der Tabelle und ziehen Sie sie zum Aktualisieren nach unten.
  • Neue Beiträge werden nicht geladen und alte verschwinden nicht und der Beitragszähler wird nicht zurückgesetzt.

Der Standardansatz zur Korrektur solcher Fehler besteht darin, zu untersuchen, was in der Methodenauswahl geschieht, die für das UIRefreshControl unserer Tabelle verantwortlich ist. Wechseln Sie zum PostsTableViewController im Abschnitt Pragma-Markierungsunterstützung für Steuerelemente aktualisieren . Aus der Funktion setupRefreshControl können wir schließen, dass der Selektor, der für die Aktualisierung der Beiträge verantwortlich ist, die Funktion reloadNewPosts ist. Fügen wir der ersten Zeile dieser Funktion einen Haltepunkt hinzu und finden heraus, was genau hier passiert. Scrollen Sie nun zum Anfang der Tabelle und ziehen Sie den Bildschirm zum Aktualisieren.

Bild
Ziel-c

Bild
Schnell

Der Debugger wurde an dem von Ihnen festgelegten Haltepunkt angehalten. Klicken Sie für weitere Studien auf die Schaltfläche "Block überspringen" des Debuggers.

Bild
Ziel-c

Bild
Schnell

Jetzt haben wir ein Verständnis dafür, was falsch läuft!

Die if-Bedingung ist nicht erfüllt (dh die boolesche Variable isPullDownToRefreshEnabled wird auf NO gesetzt), und der Code zum Aktualisieren von Posts wird übersprungen.

Der Standardansatz besteht darin, den Compiler anzuhalten. Anschließend müssen Sie isPullDownToRefreshEnabled auf YES / true setzen. Dies würde das Problem lösen. Es wäre jedoch viel bequemer, zuerst unsere Hypothese zu testen, bevor Sie Änderungen am Code vornehmen, ohne den Compiler stoppen zu müssen. Hier erweisen sich die Debugger-Befehlsbefehle als sehr nützlich.

Doppelklicken Sie auf den installierten Haltepunkt oder klicken Sie mit der rechten Maustaste auf "Haltepunkt bearbeiten" und klicken Sie auf die Schaltfläche "Aktion hinzufügen". Wählen Sie auch den Aktionstyp "Debugger-Befehl".

Bild

Jetzt müssen wir die Eigenschaft isPullDownToRefreshEnabled auf YES / true setzen. Fügen Sie dem Debugger den folgenden Befehl hinzu.

Ziel-c

expression self.isPullDownToRefreshEnabled = YES 


Bild

Schnell

 expression self.isPullDownToRefreshEnabled = true 

Bild

Aktivieren Sie als Nächstes das Kontrollkästchen "Nach Auswertung von Aktionen automatisch fortfahren". Er ist dafür verantwortlich, dass der Debugger nicht jedes Mal am Haltepunkt stoppt und automatisch mit dem neu hinzugefügten Befehl weiterarbeitet. Scrollen Sie nun zum Anfang der Tabelle und ziehen Sie sie zum Aktualisieren nach unten.

Voila, die neuen Beiträge wurden geladen und die alten ersetzt, und dementsprechend wurde der Beitragszähler aktualisiert.

Wir haben das erste Problem gelöst, holen Sie sich Ihre Anti-Bug-Waffe und fahren mit dem zweiten fort.

2. Der Benutzer erhält keine Benachrichtigung (mithilfe des Alert-Controllers), dass die HTTP-Anforderung aufgrund von Verbindungsproblemen nicht abgeschlossen wurde.

So reproduzieren Sie den Fehler:

  • Trennen Sie die Internetverbindung in Ihrem iPhone / Simulator.
  • Scrollen Sie zum Anfang der Tabelle und ziehen Sie sie zum Aktualisieren nach unten.
  • Neue Beiträge werden aufgrund eines Internetverbindungsfehlers nicht heruntergeladen.
  • Dem Benutzer wird keine Fehlerbenachrichtigung angezeigt.

Gehen Sie zum PostsTableViewController im Abschnitt Netzwerkmarkierung . Es hat genau eine loadPosts- Funktion. Es verwendet eine allgemeine Netzwerkmanagerinstanz, um eine GET-HTTP-Anforderung auszuführen, die ein Array von Posts über einen Abschluss-Handler "Erfolg" oder NSError über einen Abschluss-Handler "Fehler" zurückgibt .

Wir müssen den Code zum "erfolglosen" Abschluss hinzufügen, um einen Alert-Controller anzuzeigen. Wenn Sie zum Abschnitt Pragma-Markierungsunterstützung gehen, werden Sie feststellen , dass bereits eine Funktion PresentNetworkFailureAlertController vorhanden ist, die für die Anzeige des gewünschten Alarmcontrollers verantwortlich ist. Alles was wir tun müssen, ist diese Funktion innerhalb eines "fehlgeschlagenen" Abschlusses in loadPosts aufzurufen .
Der traditionelle Weg besteht darin, den Simulator anzuhalten und den gewünschten Code hinzuzufügen. Lass uns den anderen Weg gehen!

Fügen Sie nach der Zeile einen Haltepunkt innerhalb des "nicht erfolgreichen" Abschlusses hinzu

Ziel-c

 [self updateUIForNetworkCallEnd]; 

Schnell

 self.updateUIForNetworkCallEnd() 

Doppelklicken Sie auf den installierten Haltepunkt oder klicken Sie mit der rechten Maustaste auf "Haltepunkt bearbeiten" und klicken Sie auf die Schaltfläche "Aktion hinzufügen". Wählen Sie auch den Aktionstyp "Debugger-Befehl".

Fügen Sie dem Debugger den folgenden Befehl hinzu.

Ziel-c

 expression [self presentNetworkFailureAlertController] 

Bild

Schnell

 expression self.presentNetworkFailureAlertController() 

Bild

Stellen Sie sicher, dass das Kontrollkästchen "Nach Auswertung von Aktionen automatisch fortfahren" aktiviert ist.
Scrollen Sie bei ausgeschaltetem Internet zum Anfang der Tabelle und ziehen Sie sie zum Aktualisieren nach unten. Sie können auch zum Ende der Tabelle scrollen und versuchen, neue Beiträge zu laden. Folgendes werden Sie sehen:

Bild

Was wir gerade getan haben, heißt " Injizieren " des Codes mit einem Befehl, der dem Debugger an einem bestimmten Haltepunkt hinzugefügt wurde.

Eine kleine Zusammenfassung

Lassen Sie uns noch einmal auflisten, was wir mit den Debugger-Befehlen tun können, die dem Haltepunkt hinzugefügt wurden:

  • Arbeiten Sie mit einem vorhandenen Eigenschaftswert.
  • Fügen Sie eine neue Codezeile hinzu.

Beide Aufgaben wurden während der Programmausführung erledigt. Wir müssen den Compiler im Wesentlichen nicht stoppen, um Fehler zu beheben und die Anwendung neu zu starten.

Was kommt als nächstes?

Des Weiteren mache ich Sie auf den zweiten Teil des Artikels aufmerksam , in dem wir weitere Fehler korrigieren und mehr über eine andere Art von Haltepunkt (Haltepunkt) erfahren - den Beobachtungspunkt (Beobachtungspunkt).

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


All Articles