Xcode 'po' не может определить переменную, которую я хочу изучить. WNY?

Окружающая среда: Xcode 6 Beta 4
Я пытаюсь просто взглянуть на текстовое значение, используя отладчик. Однако отладчик не может идентифицировать статическую переменную (через "Let" ). Это справедливо и для vars.

Почему?

func textFieldShouldReturn(textField:UITextField) -> Bool {
    let myText = "Hello World"
    let theText = textField.text! as String
    return true
}

Результат отладчика:

(lldb) po textField error:: 1:1: ошибка: использование неразрешенных Идентификатор textField textField ^: 11: 5: ошибка: использование неразрешенный идентификатор '$ __ lldb_injected_self'     $ __ lldb_injected_self. $__ lldb_wrapped_expr_29 (
    ^ (lldb) po myText error:: 1:1: ошибка: использование неразрешенного идентификатора 'myText' myText ^: 11: 5: ошибка: использование неразрешенных идентификатор '$ __ lldb_injected_self'     $ __ lldb_injected_self. $__ lldb_wrapped_expr_30 (
    ^ (lldb) po theText error:: 1:1: ошибка: использование неразрешенного идентификатора 'theText' theText ^: 11: 5: ошибка: использование неразрешенных идентификатор '$ __ lldb_injected_self'     $ __ lldb_injected_self. $__ lldb_wrapped_expr_31 (
    ^ (lldb)

Примечание. Отладочный вывод установлен на "Все выходы".

Вот скриншот:

enter image description here

Ответы

Ответ 1

Это проблема, с которой я столкнулся, и я думаю, что это ошибка в отладчике. Если вы не используете ЛЮБЫЕ переменные, объявленные с помощью "let", команда po будет работать. Это не то, чего вы хотите, поэтому я подал ошибку с Apple по этой проблеме.

Я думаю, вам стоит просто надеяться, что он будет исправлен в следующей бета-версии (напишите ошибку, пожалуйста, так как количество зарегистрированных ошибок повлияет на приоритет Apple при их исправлении). В то же время перейдите к обходному пути Amitays.

Ответ 2

Как подтверждают другие выше, это в значительной степени является ошибкой в ​​Swift/LLDB. Это в основном работало с 6.1.1, сломалось до или до 6.3 Beta 1 и снова исправлено в 6.3 Beta 2.

Я просто использую приложение командной строки в качестве теста и не могу тестировать с помощью UIKit, но я видел подобные проблемы вне UIKit - и по проблемам я имею в виду, что получил результаты, подобные OP, но теперь это работая:

struct Foobar {
    var foo:String
    var bar:String
}

func textFieldShouldReturn() -> Bool {
    let fubar = Foobar(foo: "Onesy", bar: "Twosy")
    let myText = "Hello World"
    return true
}

textFieldShouldReturn()

p и po дают несколько разные результаты и зависят от того, выполняется ли Printable:

(lldb) po fubar
(foo = "Onesy", bar = "Twosy")

(lldb) p fubar
(AssertClientMacDirect.Foobar) $R1 = (foo = "Onesy", bar = "Twosy")

В потоке здесь: https://devforums.apple.com/message/1111705#1111705, вы также можете использовать команду image lookup -t <SymbolName>

image lookup -t Fubar

<path redacted>
id = {0x1000003e0}, name = "AssertMac.Fubar", byte-size = 8, clang_type = "class Fubar {
class func `new`(name: Swift.String) -> AssertMac.Fubar
init(name: Swift.String)
func test()
var someValue: Swift.String
var name: Swift.String
@objc deinit
}

Следует подчеркнуть, что вам следует дважды проверить, что для компилятора Swift установлено значение:

  • Отладка/Оптимизация → Нет,
  • Символы с разделителями на копии → НЕТ,
  • Оптимизация времени связи → Нет
  • Символы Strip на Install → NO, (для отладочных сборников, где это необходимо)

Если вы реализуете Printable в классе swift, вы получите результаты свойства описания.

Были предыдущие ошибки Xcode, в которых Xcode сбой при попытке выполнить оптимизированный код.