Отладчик Xcode 6 beta 2 не показывает содержимое переменной после вызова String.componentsSeparatedByString

#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 почти так же удобочитаем, но, по крайней мере, он работает!