Xcode und erweitertes Debugging in LLDB: Teil 2

Guten Tag, heute mache ich Sie auf den zweiten Teil des Artikels über das Debuggen von Anwendungen in LLDB aufmerksam.

Im ersten Teil haben wir herausgefunden, wie Haltepunkte in Xcode verwendet werden, um vorhandene Eigenschaften von Variablen zu ändern und eine Codezeile über Anweisungsbefehle hinzuzufügen.

Ich habe absichtlich ein Demo-Projekt mit einigen Fehlern erstellt, um herauszufinden, wie verschiedene Arten von Haltepunkten in LLDB zum Debuggen der Anwendung verwendet werden.

Wenn Sie den ersten Teil des Artikels nicht studiert haben, ist es besser, damit zu beginnen. Ich möchte Sie an eine wichtige Regel dieses Tutorials erinnern: 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.

Überwachungspunkte

Also der folgende Fehler in der Anwendung:

3. Sie können Beiträge mehr als 7 Mal laden.

So reproduzieren Sie den Fehler:

  • Schalten Sie das Internet auf Ihrem iPhone / Simulator ein
  • Scrollen Sie zum Ende der Tabelle, um weitere Beiträge zu laden.
  • Sie können Beiträge mehr als sieben Mal laden (obwohl der Benutzer in dieser Anwendung keine solche Möglichkeit haben sollte).

Als eine der Optionen zum Erkennen von Fehlern müssen Sie herausfinden, wie die Ganzzahlvariable pageNumber aktualisiert wird, nachdem neue Beiträge auf die Seite geladen wurden. Da Sie mit meinem Code immer noch nicht vertraut sind, müssen Sie einige Zeit aufwenden, um zu verstehen, was darin geschieht.

Mach dir keine Sorgen. Wende etwas Magie an.

Aus dem ersten Teil des Artikels haben wir erfahren, dass die GET HTTP-Anforderung im Abschnitt Pragma Mark Networking ausgeführt wird. Es enthält genau eine loadPosts- Funktion. Platzieren Sie einen Haltepunkt in der ersten Zeile dieser Funktion und ziehen Sie die Tabelle zum Aktualisieren nach unten. Der Compiler stoppt an diesem Haltepunkt.

Bild
Ziel-c

Bild
Schnell

Klicken Sie im unteren Fenster des Debuggers auf die Schaltfläche "Variablen anzeigen". Links wird ein neues Fenster geöffnet, in dem Sie alle Variablen PostsTableViewController sehen.

Bild

Zeigen Sie mit dem Cursor auf pageNumber, klicken Sie mit der rechten Maustaste und wählen Sie "Watch _pageNumber" / "Watch pageNumber" für Objective-C bzw. Swift.

Bild
Ziel-c

Bild
Schnell

Sie haben also den sogenannten Watchpoint für die Variable pageNumber erstellt. Watchpoint ist eine Art Haltepunkt, der den Debugger jedes Mal stoppt, wenn sich der Wert der Variablen ändert.

Bild
Ziel-c

Bild
Schnell

Setzen Sie das Programm fort. Der Debugger stoppt und Sie sehen Folgendes:

Ziel-c

Bild

  1. Zeichnet die alten und neuen Werte der Variablen pageNumber auf .
  2. Verfolgen eines Codestapels , der den Wert der pageNumber- Variablen ändert .
  3. Der aktuelle Punkt, an dem sich die Variable pageNumber geändert hat, ist die Setter-Methode dieser Variablen.

Wenn Sie sich bei der Stapelverfolgung auf Schritt 1 beziehen, gelangen Sie zum folgenden Codeausschnitt:

Bild

Schnell

Bild

  1. Der Debugger informiert Sie darüber, dass der von Ihnen festgelegte Beobachtungspunkt etwas enthüllt hat.
  2. Verfolgen eines Codestapels , der den Wert der pageNumber- Variablen ändert .
  3. Der aktuelle Punkt, an dem sich die Variable pageNumber geändert hat, ist die Funktion updateForNetworkCallEnd .

Es ist logisch zu schließen, dass jedes Mal nach einer erfolgreichen HTTP-GET-Anforderung die Variable pageNumber um 1 erhöht wird, bis sich die Statusvariable (vom Aufzählungstyp) im Status "aktiv" befindet. Diese Variable kann zwei Zustände haben: entweder aktiv ("aktiv") oder inaktiv ("inaktiv"). Der Status "aktiv" bedeutet, dass der Benutzer Beiträge laden kann (dh das Limit von 7 Downloads wurde nicht erreicht). Der Status "inaktiv" geht dagegen davon aus, dass der Benutzer keine Beiträge mehr laden kann. Infolgedessen müssen wir der Funktion updateForNetworkCallEnd eine Logik hinzufügen , die die Variable pageNumber überprüft und die Statusvariable auf den entsprechenden Status setzt.

Wie Sie vielleicht vermutet haben, ist es viel einfacher, die Hypothese zuerst zu testen, ohne den Compiler anzuhalten, bevor Sie Änderungen am Code vornehmen.

Ich stelle fest, dass wir im Abschnitt Pragma Mark Support bereits die Funktion haben, die wir benötigen ( setToInactiveState ), die die Statusvariable auf "inaktiv" setzt.
Fügen Sie eine Zeile über der if- Bedingung einen Haltepunkt hinzu. Fügen Sie dem Debugger auch den folgenden Anweisungsbefehl hinzu.

Ziel-c

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

Bild

Schnell

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


Bild

Löschen Sie danach den ersten Haltepunkt, mit dem Sie den Beobachtungspunkt festgelegt haben. Deaktivieren Sie auch den Watchpoint selbst.

Bild
Ziel-c

Bild
Ziel-c

Bild
Schnell

Bild
Schnell

Scrollen Sie nun in den Tabellen nach oben, ziehen Sie zum Aktualisieren nach unten und beginnen Sie mit dem Umblättern.
Alles hat geklappt! Aber es ist zu früh zum Feiern, wir müssen noch einen Fehler beheben!

Was weiter?

Der letzte, dritte Teil des Artikels, in dem wir etwas über eine andere Art von Haltepunkten lernen - symbolische (symbolische Haltepunkte).

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


All Articles