Отладчик XCode не печатает объекты и показывает ноль, когда они не


165

Xcode показывает ошибку при попытке напечатать объект с po <objectName>, но только для одного проекта.

Скриншот

ошибка: не удалось материализовать структуру: размер переменной <varName> не соответствует размеру объекта ValueObject. Ошибка в Execute, не удалось PrepareToExecuteJITExpression

Отладчик XCode также показывает ВСЕ объекты как nil( selfисключенные), когда они не ( NSLogпоказывает правильный вывод, как видно на изображении). Я не знаю, что случилось с проектом. Любой другой проект работает нормально.

Есть идеи, что это может быть? (Очистка проекта не имела никакого эффекта.)


Для меня это звучит как указатель, но я уверен, что если честно. Что вы пытаетесь сделать / выполнить?
user2967030

3
Ошибка возникает на каждом объекте этого проекта. Даже NSStrings создал одну строку выше точки останова!
Бинар

1
Как сказано в вопросе, очистка ничего не меняет; (, но спасибо за попытку. Добавлено сообщение об ошибке.
Binarian

3
Вы уверены, что строите без оптимизации? (-O0)
iccir

1
Оптимизации можно устанавливать не только в настройках проекта, но и в целях. Был м застрял :(
базилик

Ответы:


269

Вы уверены, что не находитесь в «режиме выпуска»?

Если вы хотите увидеть значения переменных, вы должны быть в «Режиме отладки» (нажмите на название вашего проекта в левом верхнем углу рядом с кнопками «Пуск / Стоп», затем «Редактировать схему ...», затем «Выполнить», настройки, затем » Информация "вкладка, затем" Конфигурация сборки ". Здесь установите" Отладка ". Если он был на" Релиз ", это то, что вы видели все nils).


3
У меня есть только одна конфигурация, как изменить конфигурацию, чтобы она была как debug configuration?
Бинар

2
Хорошо, я создал пустой проект и теперь вижу все различия в том Build Settings, что для свойства развертывания Strip debug symbols during copyустановлено значение YES.
Бинар

16
@ Alex1987 я поставил Strip debug symbols during copyв NOи Optimization Levelк None -O0в проектеBuild Settings
Binarian

32
К сожалению, в определенных ситуациях lldb делает это, когда находится в режиме отладки, с отключенной оптимизацией и присутствием символов отладки. Время посетить баг report.apple.com
ctpenrose

4
Была такая же проблема - уровень оптимизации был «Нет». Проблема была в том, что Link-Time Optimization (LTO) был установлен в «Да» также для режима отладки.
pi3

38

Я установил «Уровень оптимизации» для конфигурации отладки «Нет», и это решило проблему.


2
Забавно, это не сработало. Я сделал наоборот. Я переключился на, Fastest, Smallest[-Os]и это сработало.
Nate Hat

Множество разных предложений, но этот (установка оптимизации отладки на None) исправил это для меня.
Дежаль

29

Убедитесь, что Address Sanitizer отключен в настройках вашей Схемы. Средство очистки адресов не работает с отладчиком.

  1. Перейдите в «Редактировать схему» («Продукт» >> «Схема»> «Редактировать схему»), выберите «Выполнить» и перейдите на вкладку «Диагностика».
  2. Убедитесь, что «Включить Address Sanitizer» выключен.

введите описание изображения здесь


4
Это было решением для меня. Очевидно, есть много причин, по которым это может произойти.
Манро

16

Кажется, у каждого есть свое решение.

Для меня я использую Objective-Cи Swiftв то же время.

Прежде всего, перейдите к TARGETS -> Build Settingsи искатьcode generation

Вы найдете Apple LLVM 6.0 и Swift Compiler

Измените их Optimization Levelвсе на None, затем Отладка, вы можете найти значение неnil

Удивительно, но как только вы видите значение, вы решаете эту проблему навсегда, тогда вы можете изменить Optimization Levelего на прежнее значение.


11

Есть и другие способы, которыми это может произойти. Для меня это было потому, что значение «Другие флаги C» было установлено на «-O2», даже для отладочной сборки. Отключение этого для отладочной сборки решило проблему.


9

Отфильтрованный отладочный вывод

Для меня Xcode отфильтровывал выходные данные отладчика. Убедитесь, что в качестве выходного параметра выбрано «Вывод отладчика» или «Весь вывод».


6

Я только столкнулся с этой проблемой и обнаружил, что это потому, что Deployment Postprocessing = YESв настройках сборки.

Изменив это, чтобы NOисправить это, как показано на скриншоте ниже:

введите описание изображения здесь

Версия Xcode: 6.0.1 (6A317) на OSX 10.9.5


5

Я просто столкнулся с подобной проблемой: однажды внезапно отладчик XCode распечатал некоторые типы объектов, особенно NSStrings, как (null), хотя они были инициализированы значением. Распечатано через

NSLog(@"String value: %@", myString);

правильное значение для объекта было показано.

Заблуждение! Решение проблемы было довольно простым: я просто выключил Xcode и перезагрузил компьютер. После перезапуска Xcode все снова работает нормально :).


5

Убедитесь, что Link-Time Optimization = Noв режиме отладки в настройках сборки.


Я только встречаю эту проблему в Xcode 8 только на моих настройках сборки динамического фреймворка! Thx
vmeyer

3
  1. Удалить производные данные
  2. Довольно Xcode / Перезагрузка
  3. Чистый Проект

Это все, что нужно для меня.


2

Решения, приведенные здесь, также исправят ошибку, которую вы видите error: <EXPR>:1:1: error: use of unresolved identifierкаждый раз, когда пытаетесь poиспользовать переменную.

Для меня решение было пойти Build Settingsи найти Optimization Levelи убедиться, что каждый Debugпараметр был установлен на None.


Это фактически исправило это для меня. Любая идея, что минус для отключения настройки?
Джаспер

1

Перейдите к «Другие флаги C» в настройке сборки и установите значение отладки от -o2 до -O0.


0

Я также столкнулся с этим, и когда я обнаружил, что я был в режиме выпуска, я переключаюсь на отладку ... не исправить. Оказывается, я должен был сначала сделать чистку (cmd + shift + k).

Поэтому я думаю, что после встроенного режима выпуска не все перекомпилируется при разработке, и поэтому lldb не может правильно читать символы. После очистки и перекомпиляции в разработке у меня все заработало.


-3

Реальность такова, что система должна работать "из коробки", а не из-за ссылок на множество различных настроек, до такой степени, что вещи могут работать для вас или нет.

Почему система не позволяет всегда отлаживать, когда в режиме отладки остается загадкой, на которую может ответить только Apple (если они заботятся, что в последнее время я сомневаюсь, что они делают).

В конце концов, разница между отладкой / без отладки заключается в дополнительных таблицах с метаданными, которые только заполняют пространство памяти / диска.

Если вы компилируете против симулятора или устройства напрямую, вам не нужны эти лишние мегабайты.

Поэтому нам нужно запустить дополнительные циклы, чтобы просто сделать простую и понятную вещь, которую все иды, которые я знаю с прошлого столетия, делают просто отлично.

И добавлю, для меня то, что сработало, изменило в «Отладке» оптимизацию времени соединения с «Монолитного» на «Нет» (xcode 8).


Xcode = Нет менеджера пакетов из коробки, автозаполнение и другие функции работают по желанию, время компиляции огромно и т. Д.
zirinisp
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.