Xcode Debugger: Wert der Variablen anzeigen

106

Mein Code in einem UITableViewController:

delegate.myData = [myData objectAtIndex:indexPath.row];

Wie kann ich die Werte von delegate.myDataoder indexPath.rowim Debugger sehen? delegate.myDatasollte ein Array und indexPath.rowein sein int. Ich kann nur Speicheradressen der Objekte sehen delegateund indexPathaber wo sind myDataund row?

Alt-Text

Manni
quelle

Antworten:

142

Aktivieren Sie diese Option. So zeigen Sie den Inhalt der NSDictionary-Variablen im Xcode-Debugger an.

Ich benutze auch

po variableName
print variableName

in der Konsole.

In Ihrem Fall ist es möglich, auszuführen

print [myData objectAtIndex:indexPath.row]  

oder

po [myData objectAtIndex:indexPath.row]
Andriy
quelle
Danke dir! Ich versuche viel: "print [myData objectAtIndex: indexPath.row]", "po [myData objectAtIndex: indexPath.row]", "print indexPath.row", "po indexPath.row", ... Aber jedes Mal, wenn ich hat die Meldung "Es gibt kein Mitglied mit dem Namen row." Dies funktioniert: "print indexPath" und "po indexPath". Also habe ich versucht, "[]" anstelle von "." Zu verwenden: "po [indexPath row]" -> "Die Beschreibung eines NIL-Objekts kann nicht gedruckt werden." "po [indexPath getRow]" -> "Ziel antwortet nicht auf diese Nachrichtenauswahl." :-(
Manni
4
versuchen Sie es mit print (int) [indexPath row]
Andriy
po [myData objectAtIndex: (int) [indexPath row]]
Andriy
@ VanDuTran Ich bin mir ziemlich sicher, dass das Äquivalent zu po objin Swift ist po print(obj).
Chris
Dies war auch perfekt, um die Werte der berechneten Eigenschaften zu ermitteln. Vielen Dank!
Paula Hasstenteufel
24

Ich stimme anderen Postern zu, dass Xcode als Entwicklungsumgebung eine einfache Möglichkeit zum Debuggen von Variablen enthalten sollte. Nun, gute Nachrichten, es gibt eine!

Nachdem ich eine einfache Antwort / ein Tutorial zum Debuggen von Variablen in Xcode gesucht und nicht gefunden hatte, ging ich zu Xcode selbst und fand diese (zumindest für mich) sehr nützliche Entdeckung.

So debuggen Sie Ihre Variablen einfach in Xcode 4.6.3

Stellen Sie im Hauptbildschirm von Xcode sicher, dass der untere Debug-Bereich angezeigt wird, indem Sie auf die im Screenshot gezeigte Schaltfläche in der oberen rechten Ecke klicken.

Schaltfläche "Debug-Bereich"

Debug-Bereich in Xcode 4.6.3

Legen Sie nun einen Haltepunkt fest - die Zeile in Ihrem Code, in der Ihr Programm angehalten werden soll, indem Sie auf den Rand Ihres Codebereichs klicken.

Haltepunkt

Suchen Sie nun im Debug-Bereich nach diesen Schaltflächen und klicken Sie auf die in der Mitte. Sie werden feststellen, dass Ihr Gebiet jetzt zweigeteilt ist.

Debug-Bereich teilen

Sollte so aussehen

Führen Sie nun Ihre Anwendung aus.

Wenn der erste Haltepunkt während der Ausführung Ihres Programms erreicht wird, sehen Sie auf der linken Seite alle an diesem Haltepunkt verfügbaren Variablen.

Suchfeld

Sie können die linken Pfeile auf der Variablen für weitere Details erweitern. Verwenden Sie sogar das Suchfeld, um die gewünschte Variable zu isolieren und zu sehen, wie sie sich in Echtzeit ändert, wenn Sie in den Bereich des Haltepunkts "eintreten".

Hineinsteigen

Auf der rechten Seite Ihres Debug-Bereichs können Sie die gewünschten Variablen senden, indem Sie mit der rechten Maustaste auf die gewünschte Variable klicken.

Kontextmenü

Wie Sie sehen können, ist dieses Kontextmenü voller sehr interessanter Debugging-Optionen. Zum Beispiel Watch , das bereits mit eingegebenen Befehlen vorgeschlagen wurde, oder sogar Edit Value… , das den Laufzeitwert Ihrer Variablen ändert!

Lex L.
quelle
21

Du kannst auch:

  1. Legen Sie einen Haltepunkt fest, um die Ausführung anzuhalten.
  2. Das Objekt muss sich im Ausführungsbereich befinden
  3. Bewegen Sie den Mauszeiger über das Objekt oder die Variable
  4. Ein gelber Tooltip wird angezeigt
  5. Bewegen Sie die Maus über den Tooltip
  6. Klicken Sie auf die beiden kleinen Pfeile, die nach oben und unten zeigen
  7. Ein Kontextmenü wird angezeigt
  8. Wählen Sie "Beschreibung beschreiben", um eine [Objektbeschreibung] auszuführen.
  9. Die Beschreibung wird in der Ausgabe der Konsole angezeigt

IMHO ein bisschen versteckt und umständlich ...

Lichtmann
quelle
In meinem Xcode funktioniert "Druckbeschreibung" nicht. Wie kann ich ihn aktivieren?
Kirtikumar A.
@kirtiavaiya Die Anwendung muss angehalten sein und Ihre Variable muss sich innerhalb des aktuellen Bereichs befinden, der gedruckt werden soll. Sie können "self.variable" auch nicht direkt drucken, aber Sie können die Andriy-Lösung zum Drucken von _ <Name der Variablen> verwenden. Zum Beispiel: Für self.btnHello schreiben Sie in die Konsole "po _btnHello" (dies funktioniert nur, wenn Sie den Namen der Getter-Methode nicht geändert haben)
LightMan
@ LightMan ja, es ist wie du gesagt hast, aber dann funktioniert es auch nicht
Kirtikumar A.
10

Ihre Verwirrung ergibt sich aus der Tatsache, dass deklarierte Eigenschaften keine (notwendigerweise wie) (Instanz-) Variablen sind.

Der Ausdruck

indexPath.row

ist äquivalent zu

[indexPath row]

und die Zuordnung

delegate.myData = [myData objectAtIndex:indexPath.row];

ist äquivalent zu

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

Annahme einer Standardbenennung für synthetisierte Eigenschaften.

Darüber hinaus delegatewird wahrscheinlich vom Typ deklariert id<SomeProtocol>, dh der Compiler konnte zu delegatediesem Zeitpunkt keine tatsächlichen Typinformationen bereitstellen , und der Debugger stützt sich auf Informationen, die zur Kompilierungszeit bereitgestellt wurden. Da ides sich um einen generischen Typ handelt, gibt es keine Informationen zur Kompilierungszeit für die Instanzvariablen in delegate.

Dies sind die Gründe, warum Sie nicht myDataoder rowals Variablen sehen.

Wenn Sie das Ergebnis des Sendens -rowoder überprüfen möchten -myData, können Sie Befehle verwenden poder po:

p (NSInteger)[indexPath row]
po [delegate myData]

oder verwenden Sie das Ausdrucksfenster (wenn Sie beispielsweise wissen , dass es sich um einen delegatetatsächlichen Typ handelt MyClass *, können Sie einen Ausdruck hinzufügen (MyClass *)delegateoder mit der rechten Maustaste klicken delegate, View Value as…den tatsächlichen Typ von auswählen und eingeben delegate(z MyClass *. B. ).

Trotzdem stimme ich zu, dass der Debugger hilfreicher sein könnte:

  • Es kann eine Option geben, das Debugger-Fenster anzuweisen, Laufzeitinformationen anstelle von Informationen zur Kompilierungszeit zu verwenden. Dies würde den Debugger zwar verlangsamen, aber nützliche Informationen liefern.

  • Deklarierte Eigenschaften können in einer Gruppe namens Eigenschaften angezeigt werden und eine (optionale) Überprüfung direkt im Debugger-Fenster ermöglichen. Dies würde auch den Debugger verlangsamen, da eine Nachricht gesendet / eine Methode ausgeführt werden muss, um Informationen abzurufen, aber auch nützliche Informationen liefern würde.

Chris G.
quelle
Ich danke Ihnen für Ihre Erklärung! Das hat mir sehr geholfen! :-)
Manni
7

Sie können Werte zur Laufzeit auf das Konsolenfenster drucken. Unten sind Schritte:

  1. Platzieren Sie einen Haltepunkt, für den Sie Werte erhalten möchten
  2. Führen Sie nun ein schrittweises Debugging durch.
  3. Setzen Sie einen Cursor auf eine Variable / einen Delegaten, deren Wert zur Laufzeit überprüft werden soll.
  4. Dies zeigt nun die Beschreibung der Variablen / des Delegaten
  5. Wenn Sie auf "i" klicken, wird eine detaillierte Beschreibung angezeigt
  6. Dadurch werden auch Details in das Konsolenfenster gedruckt.

Screenshot zum Drucken von Details im Konsolenfenster

Jayprakash Dubey
quelle
1
Funktioniert dies bei Swift? Ich bin neu bei Swift. Ich kann die Werte von Objekten nicht sehen, wie wir sie in obj c sehen.
Umairhhhs
1
@umairhhhs Dieser Beitrag ist nur für Objective-C.
Jayprakash Dubey
1
Ich frage mich, warum dies nicht im schnellen Editor ist, weil das sehr hilfreich und zeitsparend war.
Umairhhhs
1

Das wird etwas kompliziert. Diese Objekte sind benutzerdefinierte Klassen oder Strukturen, und das Betrachten in Xcode ist für Xcode nicht so einfach wie in anderen Entwicklungsumgebungen.

Wenn ich Sie wäre, würde ich die Werte, die Sie sehen möchten, mit einer Beschreibung NSLoggen.

dh:

NSLog(@"Description of object & time: %i", indexPath.row);
Aurum Aquila
quelle
11
Ja, NSLog ist eine Möglichkeit, aber keine komfortable Alternative zum Debuggen. Ich bin sehr überrascht, dass es keine Möglichkeit gibt, die gewünschten Werte anzuzeigen. Das gehört zur Grundfunktionalität einer Entwicklungsumgebung.
Manni
2
Das Wütendste an XCode. Erbärmlich.
Ryan0
1

Versuchen Sie Run-> Show-> Expressions

Geben Sie den Namen des Arrays oder was auch immer Sie suchen ein.

Knochen
quelle
Danke dir! Ich habe "indexPath.row" und "delegate.myData" in das Ausdrucksfenster eingegeben, aber jedes Mal erscheint "außerhalb des Gültigkeitsbereichs" in der Spalte "Zusammenfassung" :-(
Manni
np, ich hatte das gleiche Problem, bis ich es fand;)
tbone
1
Setzen Sie einen Haltepunkt direkt nach dem Festlegen Ihres Arrays oder was auch immer und Sie sollten den Wert in Ausdrücken finden. Viel Glück
tbone