Xcode'da LLDB ile hata ayıklarken değişkenlerin değeri nasıl değiştirilir?


173

Xcode'da GDB, hata ayıklama sırasında yerel değişkenleri değiştirmenize izin verir ( XCode'da hata ayıklama sırasında NSString değerinin nasıl değiştirileceğine bakın ? ). LLDB benzer bir işlev sunuyor mu? Öyleyse, nasıl kullanabiliriz?


1
İOS'ta Gelişmiş hata ayıklamayı gördüğünüzden emin olun . Harika
Honey

Dize uzunluğu 0-15 karakter arasında ise çalışır bir nesne özelliği ayarlamaya çalışıyorum. 16 veya daha fazla karakterden oluşan bir dize ayarlamak kabul edilir, ancak geri yazdırdığımda bana saçma bir dize gösterir: po myObj.someString = "1234567890123456", işe yarıyor, ancak yazdırdığımda (String? $ R68 = " \ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
Nick Wright

Yanıtlar:


267
expr myString = @"Foo"

(lldb) help expr
Geçerli kapsamdaki değişkenleri kullanarak geçerli program bağlamında bir C / ObjC / C ++ ifadesini değerlendirin. Bu komut 'raw' girdisini alır (herhangi bir şey teklif etmeye gerek yoktur).

Sözdizimi: ifade -

Komut Seçenekleri Kullanımı: ifade [-f] [-G] [-d] [-u] - ifade [-o] [-d] [-u] - ifade

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

Örnekler:

expr my_struct-> a = my_array [3]
expr -f bin - (dizin * 8) + 5
ifade ifadesi c [] = "foo"; c [0]

ÖNEMLİ NOT: Bu komut 'ham' girdi aldığından, herhangi bir komut seçeneği kullanırsanız, komut seçeneklerinin sonu ile ham girişin başlangıcı arasında '-' kullanmanız gerekir.

'ifade', 'ifade' için kullanılan bir kısaltmadır


1
Gerçekten, teşekkürler! Bir küçük soru daha: Bunu bir UILabel metnini değiştirmek için yapıyorum: 'expr myLabel.text = @"hello!"ama anladım error: property 'text' not found on object of type 'UILabel *'... Herhangi bir düşünce?
Eric

10
expr (void)[label setText:@"Foo"]yapmalı. Dot-Syntax genellikle hata ayıklayıcıda çalışmaz. lldb muhtemelen bunu bir c yapısının bir üyesine erişmek istediğiniz gibi yorumlar, ancak bunun işe yaramamasının nedeni olup olmadığından emin değilim. Dot-Syntax da çalışmaz po. yerine po label.textkullanmak zorundasınızpo [label text]
Matthias Bauch

4
Aslında, lldb nokta sözdizimini gdb'den çok daha iyi işler. gdb sadece başarısız olan bir C-yapısı gibi davrandığınızı varsayar. lldb, özelliklere yalnızca gerçekten bildirildiklerinde doğru şekilde erişir @property.
BJ Homer

28
İçin pkısayol olarak da kullanabilirsiniz expr. Örnek:(lldb) p url = @"http://google.com"
funroll

11
İçin ekısayol olarak da kullanabilirsiniz expr. BTW, pyazdırma için bir takma expr --addır (yalnızca ham girdiyi değerlendirin, bayrak yok) expr -o -- [object]veya pogenellikle nesneler için daha yararlı çıktılar verir.
Jason Newell

21

Aşağıdaki şeyler benim için çalışıyor. Xcode 8 kullanıyorum.

Nil'e bazı değişkenler (örneğin "dikte") ayarlamak ve daha sonra kod akışını test etmek istiyorsanız, aşağıdakileri deneyebilirsiniz.

  1. İstenen değere başladıktan sonra kesme noktasını uygun şekilde yerleştirin.
  2. sonra değiştirmek için lldb komut satırında "expression dict = nil" komutunu çalıştırın. (örneğin "nil")
  3. Kırılma noktasının üzerinden geçin.
  4. Bir sonraki satırdaki "dict" değişkenini kontrol edin. Sıfır olacak.

Konsoldaki gibi görünecek.

(lldb) expression dict = nil
(NSDictionary *) $5 = nil

3

Xcode 10 veya 11 kullanıyorsanız, gerekli değişkene başladıktan sonra kesme noktasını düzgün bir şekilde koyun, sonra değişkeninizi po myString = "Hello World"kolayca kullanarak değiştirebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.