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(
^
Ответы
Ответ 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