#swift #xcode6
#swift #xcode6
Вопрос:
По какой-то причине LLDB не показывает мне содержимое переменных, пока я просматриваю свой Swift-код. Фактическое выполнение работает нормально, но независимо от того, что я пытаюсь, я не могу увидеть содержимое своих строк!
Вот что я вижу в списке переменных:
На данный момент type
содержит «name» и value
содержит «Logan». Но вы не смогли бы определить это, глядя сюда. Если я использую кнопку «быстрый просмотр», она сообщает, что значение равно «(None)».
И я получаю такую тарабарщину, когда пытаюсь po
получить строку с консоли:
(lldb) po space
error: <REPL>:1:1: error: non-nominal type '$__lldb_context' cannot be extended
extension $__lldb_context {
^
<REPL>:11:5: error: 'Space.Type' does not have a member named '$__lldb_wrapped_expr_0'
$__lldb_injected_self.$__lldb_wrapped_expr_0(
^
Однако это зависит. Иногда я получаю что-то вроде:
class name = __NSAtom
или
Printing description of [0]:
(String) [0] = {
core = {
_baseAddress = Builtin.RawPointer = 0x00000001004016f0
_countAndFlags = -4611686018427387894
_owner = Some {
Some = (instance_type = Builtin.RawPointer = 0x0000000100401820 -> 0x00007fff7b3d5390 (void *)0x00007fff7b3d5340: __NSCFString)
}
}
}
или
Printing description of declaration:
(String) declaration = <DW_OP_piece for offset 8: top of stack is not a piece>
…но никогда не показывает фактическое содержимое строки!
Обновить:
Я заметил, что проблема, похоже, начинает возникать только после того, как в функции выполняется вызов componentsSeparatedByString()
. (Это происходит прямо вверху, поэтому, когда я переходил, я не заметил, что отладчик действительно показывает значение до этого момента.) Итак, с этой функцией происходит что-то странное. Я обновил заголовок вопроса, чтобы отразить эту новую информацию.
Интересно, что, похоже, как только строка была «повреждена» этим вызовом, вы не можете просмотреть ее где-либо еще, даже при передаче в другую функцию. И любые обычные строковые переменные также недоступны для просмотра. Определенно ошибка, но мне интересно, есть ли обходной путь. Отлаживать мою программу становится действительно сложно!
Комментарии:
1. ЛОЛ, не пытайся
expr println(target)
! XD
Ответ №1:
Когда я сталкивался с этим, я использовал либо NSLog("(myThing)")
в скомпилированном коде, который я хочу отладить, либо вызывал expression NSLog("(myThing)")
, находясь в репозитории отладчика
Комментарии:
1. Теперь я получаю
error: <REPL>:1:10: error: use of unresolved identifier 'type' NSLog("(type)")
. Вздох. Он должен быть способен видетьtype
. Это параметр функции.2. Хотя это очень неудобно. Я надеюсь, что они скоро это исправят.
3. У меня эта проблема с 1-й бета-версии Xcode 6. Я помню, что видел правильный отладочный вывод только один или два раза, теперь все, что я вижу, это
use of unresolved identifier
. Я удалил все модули и так далее, дважды проверил настройки проекта Xcode, но безуспешно. Я попытался создать новый проект Xcode с нуля (игровой шаблон SpriteKit) — там не очень хорошо работает.
Ответ №2:
(обратите внимание, что вы не хотите выполнять NSLog(«(someVariable)»), поскольку расширенная строка может содержать последовательности формата% — используйте NSLog(«%@», «(someVariable)») или NSLog(«% @», someVariable) вместо этого)
Ответ №3:
Я хотел бы добавить обновление: эта проблема по-прежнему возникает в последних версиях Xcode, как 6.2, так и 6.3 beta.
Проблема заключается в части componentsSeparatedByString, и если вы замените это на split, все будет работать нормально. У меня было четыре экземпляра этого, и как только я изменил их, мое приложение перестало сбоить с зомби-версией NSString, и все мои имена переменных начали работать. Я изменил такие вещи, как это…
let bits = value!.componentsSeparatedByString(" ")
с помощью…
let bits = split(value!, { $0 == " "}, maxSplit: Int.max, allowEmptySlices: false)
Я не думаю, что split почти так же удобочитаем, но, по крайней мере, он работает!