Подтвердить что ты не робот

Po в LLDB с быстрым

Как я могу отобразить значение переменной в Swift App с LLDB?

Раньше это было как po variable_name

Теперь я обычно получаю неприятную ошибку, например:

(lldb) po a
error: <EXPR>:11:5: error: use of unresolved identifier '$__lldb_injected_self'
    $__lldb_injected_self.$__lldb_wrapped_expr_2(     
    ^
4b9b3361

Ответ 1

Эта ошибка звучит так, как будто это может быть потому, что DWARF не сообщает LLDB, где можно найти свой "я" объект. Учитывая характер Swift, LLDB должен знать тип "я", чтобы иметь возможность вводить выражение внутри вашей локальной области Один из способов узнать, является ли это вашей проблемой, - это сделать в приглашении LLDB:

(lldb) - переменная -L self

Вероятно, вы не увидите места для этого. Стоит зарегистрировать отчет об ошибке, просто чтобы отслеживать ваш конкретный случай воспроизведения

В любом случае, чтобы получить основную часть вашего вопроса. В Swift не существует механизма санкционированного языком для "описания печати", как для ObjC, поэтому, пока вы можете ввести "po self", если только self не является типом Objective-C, вы в значительной степени увидите то же самое, что "p self" или даже "frame variable self" скажет вам, что полностью основано на механизме форматирования данных LLDB. Если вы хотите подключиться к этому, чтобы настроить способ отображения объектов Swift, обязательная ссылка: http://lldb.llvm.org/varformats.html

Ответ 2

Я могу подтвердить ту же ошибку, для Xcode beta4 и  переменная кадра -L self

отображает что-то, но кажется худшим:

: (SwiftCollectionViewSample.DetailViewController) self =

Я окончательно подал ошибку, Enrico

17819707 Отладчик печатает ошибку: использование неразрешенного идентификатора '$ __ lldb_injected_self'

Ответ 3

Я сделал несколько тестов, чтобы выяснить, как это работает с Swift, результаты немного удивили меня. С объектами ObjC po вызывает debugDescription, который по умолчанию вызывает description. Это понятно. К сожалению, при работе с классами Swift это не применяется. Я сосредоточился на объектах, а не на печати отдельных переменных.

Чтобы заставить его работать (po команда в lldb), мне пришлось переопределить описание. Ниже кода, который я использовал для тестирования:

class Test : NSObject
{
    var name : String?
    var surname : String?

    override var debugDescription : String{
        return "debugDescription method"
    }

    override var description : String {
        return "description Method"
    }
}

Тестирование:

let test = Test()
test.name = "name"
test.surname = "surname"

(lldb) po test
description Method

(lldb) p test
(DebugTest.Test) $R1 = 0x00007fce11404860 {
  ObjectiveC.NSObject = {
    isa = DebugTest.Test
  }
  name = "name"
  surname = "surname"
}

(lldb) po dump(test)
▿ DebugTest.Test #0
  - super: debugDescription method
  ▿ name: name
    - Some: name
  ▿ surname: surname
    - Some: surname
description Method

(lldb) po print(test)
description Method

Меня удивило то, что po для объектов Swift вызывает description, а не debugDescription, который отличается от ObjC.

ИЗМЕНИТЬ

Чтобы заставить его действовать как с ObjC, ваш класс должен реализовать CustomDebugStringConvertible, а затем po вызовет debugDescription, который по умолчанию вызывает description. Единственное, что нужно изменить в моем примере, это добавить:

class Test : NSObject, CustomDebugStringConvertible

Reference

Проверено с помощью XCode 7.0.1 и iOS SDK 9, Swift 2.0