Wie ändere ich den Variablenwert beim Debuggen mit LLDB in Xcode?

173

In Xcode können Sie mit GDB lokale Variablen während des Debuggens ändern (siehe Ändern des NSString-Werts während des Debuggens in XCode? ). Bietet LLDB eine ähnliche Funktionalität? Wenn ja, wie können wir es verwenden?

Eric
quelle
Stellen Sie sicher, dass Advanced Debugging in iOS angezeigt wird . Es ist fantastisch
Honey
Ich versuche, eine Objekteigenschaft festzulegen, die funktioniert, wenn die Zeichenfolgenlänge zwischen 0 und 15 Zeichen liegt. Das Festlegen einer Zeichenfolge mit 16 oder mehr Zeichen wird akzeptiert, aber wenn ich sie zurückdrucke, wird mir eine unsinnige Zeichenfolge angezeigt: po myObj.someString = "1234567890123456", was funktioniert, aber wenn ich drucke, erhalte ich (Zeichenfolge? $ R68 = " \ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
Nick Wright

Antworten:

267
expr myString = @"Foo"

(lldb) help expr Evaluiert
einen C / ObjC / C ++ - Ausdruck im aktuellen Programmkontext unter Verwendung der derzeit im Gültigkeitsbereich befindlichen Variablen. Dieser Befehl nimmt 'rohe' Eingaben entgegen (es ist nicht erforderlich, Dinge zu zitieren).

Syntax: Ausdruck -

Befehlsoptionen Verwendung: Ausdruck [-f] [-G] [-d] [-u] - Ausdruck [-o] [-d] [-u] - Ausdruck

   -G <gdb-format>  ( --gdb-format <gdb-format> )
        Specify a format using a GDB format specifier string.

   -d <boolean>  ( --dynamic-value <boolean> )
        Upcast the value resulting from the expression to its dynamic type
        if available.

   -f <format>  ( --format <format> )
        Specify a format to be used for display.

   -o  ( --object-description )
        Print the object description of the value resulting from the
        expression.

   -u <boolean>  ( --unwind-on-error <boolean> )
        Clean up program state if the expression causes a crash, breakpoint
        hit or signal.

Beispiele:

Ausdruck my_struct-> a = my_array [3]
Ausdruck -f bin - (Index * 8) + 5
Ausdruck char c [] = "foo"; c [0]

WICHTIGER HINWEIS: Da dieser Befehl 'raw'-Eingaben akzeptiert, müssen Sie bei Verwendung von Befehlsoptionen zwischen dem Ende der Befehlsoptionen und dem Beginn der rohen Eingabe' - 'verwenden.

'Ausdruck' ist eine Abkürzung für 'Ausdruck'

Matthias Bauch
quelle
1
In der Tat, danke! Noch eine kleine Frage: Ich mache das, um zu versuchen, den Text eines UILabels zu ändern: 'expr myLabel.text = @"hello!"aber ich bekomme eine error: property 'text' not found on object of type 'UILabel *'... Irgendwelche Gedanken?
Eric
10
expr (void)[label setText:@"Foo"]Sollte es tun. Die Punktsyntax funktioniert normalerweise nicht im Debugger. lldb interpretiert es wahrscheinlich so, als wollten Sie auf ein Mitglied einer c-Struktur zugreifen, aber ich bin mir nicht sicher, ob dies der Grund ist, warum es nicht funktioniert. Die Punktsyntax funktioniert auch nicht po. stattdessen müssen po label.textSie verwendenpo [label text]
Matthias Bauch
4
Tatsächlich verarbeitet lldb die Punktsyntax viel besser als gdb. gdb geht einfach davon aus, dass Sie es wie eine C-Struktur behandeln, die fehlschlägt. lldb greift korrekt auf Eigenschaften zu, jedoch nur, wenn sie tatsächlich mit deklariert sind @property.
BJ Homer
28
Sie können auch pals Verknüpfung für verwenden expr. Beispiel:(lldb) p url = @"http://google.com"
Funroll
11
Sie können auch eals Verknüpfung für verwenden expr. Übrigens, pist ein Alias ​​für den Druck, der ein Alias ​​für expr --(nur die Roheingabe auswerten, keine Flags) ist expr -o -- [object]oder im poAllgemeinen eine nützlichere Ausgabe für Objekte bietet.
Jason Newell
21

Das folgende Zeug funktioniert für mich. Ich benutze Xcode 8.

Wenn Sie eine Variable (z. B. ein "Diktat") auf Null setzen und dann den Codefluss testen möchten, können Sie Folgendes versuchen.

  1. Setzen Sie den Haltepunkt nach der Initialisierung richtig auf den gewünschten Wert.
  2. Führen Sie dann "expression dict = nil" in der lldb-Befehlszeile aus, um es zu ändern. (zum Beispiel "null")
  3. Über den Haltepunkt treten.
  4. Überprüfen Sie die Variable "dict" in der nächsten Zeile. Es wird null sein.

Es wird ungefähr so ​​aussehen wie in der Konsole.

(lldb) expression dict = nil
(NSDictionary *) $5 = nil
arango_86
quelle
3

Wenn Sie Xcode 10 oder 11 verwenden, setzen Sie den Haltepunkt nach der Initialisierung auf die erforderliche Variable richtig. Dann können Sie Ihre Variable mit po myString = "Hello World"einfach ändern .

atalayasa
quelle