Jak zmienić wartość zmiennych podczas debugowania za pomocą LLDB w Xcode?

173

W Xcode GDB umożliwia zmianę zmiennych lokalnych podczas debugowania (zobacz, jak zmienić wartość NSString podczas debugowania w XCode? ). Czy LLDB oferuje podobną funkcjonalność? Jeśli tak, jak możemy z tego skorzystać?

Eric
źródło
Upewnij się, że zobaczysz Zaawansowane debugowanie w systemie iOS . To jest niesamowite
Honey
Próbuję ustawić właściwość obiektów, która działa, jeśli długość ciągu wynosi od 0 do 15 znaków. Ustawienie ciągu 16 lub więcej znaków jest akceptowane, ale kiedy go drukuję, pokazuje mi nonsensowny ciąg: po myObj.someString = "1234567890123456", który działa, ale kiedy drukuję, otrzymuję (String? $ R68 = " \ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
Nick Wright

Odpowiedzi:

267
expr myString = @"Foo"

(lldb) help expr
Oceń wyrażenie C / ObjC / C ++ w bieżącym kontekście programu, używając zmiennych znajdujących się obecnie w zakresie. To polecenie przyjmuje „surowe” dane wejściowe (nie ma potrzeby cytowania rzeczy).

Składnia: wyrażenie -

Użycie opcji polecenia: wyrażenie [-f] [-G] [-d] [-u] - wyrażenie [-o] [-d] [-u] - wyrażenie

   -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.

Przykłady:

wyrażenie my_struct-> a = my_array [3]
wyrażenie -f bin - (indeks * 8) + 5
wyrażenie char c [] = "foo"; c [0]

WAŻNA UWAGA: Ponieważ polecenie to przyjmuje „surowe” dane wejściowe, jeśli używasz jakichkolwiek opcji poleceń, musisz użyć „-” między końcem opcji polecenia a początkiem surowego wejścia.

„wyrażenie” to skrót od „wyrażenie”

Matthias Bauch
źródło
1
Rzeczywiście, dzięki! Jeszcze jedno małe pytanie: robię to, aby spróbować zmienić tekst UILabel: 'expr myLabel.text = @"hello!"ale mam error: property 'text' not found on object of type 'UILabel *'… Jakieś myśli?
Eric
10
expr (void)[label setText:@"Foo"]powinien to zrobić. Dot-Syntax zwykle nie działa w debugerze. lldb prawdopodobnie interpretuje to tak, jakbyś chciał uzyskać dostęp do elementu członkowskiego struktury c, ale nie jestem pewien, czy to jest powód, dla którego to nie zadziała. Dot-Syntax nie działa w przypadku poobu. zamiast tego po label.textmusisz użyćpo [label text]
Matthias Bauch
4
W rzeczywistości lldb obsługuje składnię kropek znacznie lepiej niż gdb. gdb zakłada po prostu, że traktujesz to jak strukturę C, co kończy się niepowodzeniem. lldb będzie poprawnie uzyskiwał dostęp do właściwości, ale tylko wtedy, gdy są one faktycznie zadeklarowane za pomocą @property.
BJ Homer
28
Możesz również użyć pjako skrótu do expr. Przykład:(lldb) p url = @"http://google.com"
funroll
11
Możesz również użyć ejako skrótu do expr. BTW, pjest aliasem dla print, który jest aliasem dla expr --(po prostu evalue raw input, no flag) expr -o -- [object]lub pogeneralnie daje bardziej użyteczne wyjście dla obiektów.
Jason Newell
21

Poniższe rzeczy działają dla mnie. Używam Xcode 8.

Jeśli chcesz ustawić jakąś zmienną (na przykład „dict”) na zero, a następnie przetestować przepływ kodu, możesz spróbować wykonać następujące czynności.

  1. Ustaw punkt przerwania poprawnie po zainicjowaniu do żądanej wartości.
  2. następnie wykonaj "expression dict = nil" w linii poleceń lldb, aby to zmienić. (na przykład „zero”)
  3. Przejdź przez punkt przerwania.
  4. Sprawdź zmienną „dict” w następnej linii. To będzie zero.

Będzie to wyglądało jak w konsoli.

(lldb) expression dict = nil
(NSDictionary *) $5 = nil
arango_86
źródło
3

Jeśli używasz Xcode 10 lub 11, ustaw punkt przerwania poprawnie po zainicjowaniu do wymaganej zmiennej, możesz łatwo zmienić swoją zmienną za pomocą po myString = "Hello World".

atalayasa
źródło