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

По какой-то причине LLDB не показывает мне содержимое переменных, пока я перехожу через мой код Swift. Фактическое выполнение работает нормально, но независимо от того, что я пытаюсь, я не вижу содержимое своих строк!

Вот что я вижу в списке переменных:

enter image description here

В этот момент type содержит "имя", а value содержит "Logan". Но вы не сможете сказать, что смотрите сюда. Если я использую кнопку "быстрый просмотр", он говорит, что значение "(Нет)".

И я получаю эту тарабарщину, когда пытаюсь po String из консоли:

(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>

... но никогда не будет фактического содержимого строки!

Update:

Я заметил, что проблема только начинает возникать, как только вызов функции componentsSeparatedByString() выполняется в этой функции. (Это происходит прямо вверху, так как я ступил, я не заметил, что отладчик действительно показывает значение до этой точки.) Так что что-то странное происходит с этой функцией. Я обновил заголовок вопроса, чтобы отразить эту новую информацию.

Интересно, что, как только строка была "повреждена" этим вызовом, вы не можете ее просматривать нигде, даже если она передана другой функции. И любые обычные строковые переменные также не доступны для просмотра. Определенно ошибка, но мне интересно, есть ли обходной путь. Мне очень тяжело отлаживать мою программу!

Ответ 1

Когда я сталкивался с этим, я использовал либо NSLog("\(myThing)") в скомпилированном коде, который я хочу отлаживать, либо вызывал expression NSLog("\(myThing)"), а в отладчике REPL

Ответ 2

(обратите внимание, что вы не хотите делать NSLog ( "(некоторые переменные)" ), поскольку расширенная строка может содержать последовательности в формате% - используйте NSLog ( "% @", "(someVariable)" ) или NSLog ( "% @", someVariable))

Ответ 3

Я хочу добавить обновление: эта проблема все еще встречается в последних версиях Xcode, как версии 6.2, так и версии 6.3 beta.

Проблема является частью компонентовSeparatedByString, и если вы замените это на split, все будет хорошо. У меня было четыре примера этого, и как только я их сменил, мое приложение перестало рушиться с выпуском Zombie NSString, и все мои имена переменных начали работать. Я изменил такие вещи...

let bits = value!.componentsSeparatedByString(" ")

с...

let bits = split(value!, { $0 == " "}, maxSplit: Int.max, allowEmptySlices: false)

Я не думаю, что раскол почти такой же читабельный, но, по крайней мере, он работает!