po в LLDB с быстрым

Как я могу вывести значение переменной в приложении Swift с помощью 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(     
    ^

person János    schedule 16.07.2014    source источник
comment
Да, отладка в Swift в настоящее время зависит от println.   -  person Jack    schedule 16.07.2014
comment
У меня была похожая ошибка отладчика, которая происходила только при попытке проверить let константы; см. мой вопрос об этом здесь — это оказалось ошибкой в ​​Xcode 6.   -  person George WS    schedule 11.10.2014
comment
Кажется, есть призыв к образцам кода / проектам, которые демонстрируют эти проблемы, от человека (лиц) команды компилятора: devforums.apple.com/message/1106278#1106278 . Любой вклад в это дело, безусловно, будет оценен всеми (и, безусловно, будет веселым парнем)   -  person Chris Conover    schedule 04.03.2015
comment
Я провел несколько тестов с текущей печатью Xcode и Swift с объектом. Может быть, это будет как-то полезно.   -  person Julian    schedule 21.10.2015


Ответы (4)


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

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

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

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

person Enrico Granata    schedule 17.07.2014
comment
Чертовски раздражает, что выпущен окончательный вариант Xcode 6, и они не могут реализовать базовую функцию для просмотра значения любой переменной во время отладки. - person János; 22.09.2014
comment
@enrico: Каков текущий уровень техники для получения символов Swift - ожидается ли, что po вообще будет работать с чистыми быстрыми объектами? Есть ли другой способ получения данных, и нужны ли для этого специальные настройки сборки? Спасибо! - person Chris Conover; 07.02.2015
comment
переменная кадра не дает того же результата, что и описание объекта. Печатает практически бесполезный хлам. - person poGUIst; 27.05.2016
comment
@poGUIst, к сожалению, не могли бы вы рассказать мне об этом подробнее? какие типы данных задействованы? что дает вам 'po', чего не дает переменная кадра? - person Enrico Granata; 01.06.2016
comment
переменная frame отображает адреса памяти ссылок на члены, а 'po' выполняет метод 'description' потомка NSObject, который обычно гораздо более информативен. На самом деле я попытаюсь напрямую вызвать метод «описание». Может быть, это помогает. 8) - person poGUIst; 22.06.2016

Я сделал несколько тестов, чтобы выяснить, как это работает со 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

Справочник

Проверено с XCode 7.0.1 и iOS SDK 9, Swift 2.0

person Julian    schedule 21.10.2015

Отличные ответы на этой странице о быстром возврате по умолчанию description при запуске lldb) po

Если это поможет, при обнаружении ошибок с объектами lldb и Swift я всегда старался быть в хорошем месте.

Во-первых, сообщите lldb, что вы находитесь в контексте Swift (не Objective-C):

(lldb) settings set target.language swift

Тогда я всегда дважды проверял, импортировал ли я Framework.

lldb) exp import WebKit
(lldb) expr let $ds = unsafeBitCast(0x6000006d74b0, to: WKWebsiteDataStore.self)
(lldb) po $ds
<WKWebsiteDataStore: 0x6000006d74b0>
person rustyMagnet    schedule 27.06.2018

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

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

: (SwiftCollectionViewSample.DetailViewController) сам =

Я обязательно зарегистрирую ошибку, Энрико.

17819707 отладчик выводит ошибку: использование неразрешенного идентификатора "$__lldb_injected_self"

person ing.conti    schedule 26.07.2014