«Имя проекта» было скомпилировано с оптимизацией - степпинг может вести себя странно; переменные могут быть недоступны

211

При попытке войти в код AFNetworking выдается следующее предупреждение:

[Project Name] was compiled with optimization - stepping may behave oddly; variables may not be available.

И, конечно, я не могу отладить код. Чтобы быть конкретным, я пытаюсь отладить UIImageView+AFNetworkingкатегорию, которая кажется невозможной. Изменение кода не имеет никакого эффекта (пробовал NSLogи т. Д.), И при попытке войти в компиляторы переходит к ассемблерному коду и отображается UIImageView+TVASTAFNetworkingкак имя категории, которого нет нигде в базе кода.

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

Использование Xcode 7. iOS 9 и 8. Cocoapods (без фреймворка)

ОБНОВЛЕНИЕ Я забыл упомянуть, что Оптимизатор настроен noneкак для конфигурации выпуска, так и для отладки, и я фактически использую Debugконфигурацию.

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

ОБНОВЛЕНИЕ 2

Strip Debug Symbols Также выключен

Mojtaba
источник
Я помню, что там была какая-то опция «Strip Debug Symbols». Это, вероятно, вызвало бы эту проблему. Это выключено?
NobodyNada
1
@NobodyNada Да Strip Debug Symbolsвыключен.
Мойтаба
Странно, я просто попытался включить Strip Debug Symbol, и предупреждение исчезло 8- |
Гомино
@Mojtaba Эй, ты узнал, как решить проблему? Я застрял с той же проблемой, так как обновлен до Xcode 7
Hadu
@Hadu: К сожалению, нет
Mojtaba

Ответы:

176

Если ваш проект использует Swift, в конфигурации проекта / цели есть две отдельные настройки «Уровень оптимизации».

Убедитесь, что вы установили их оба правильно:

  1. Выберите ваш проект на панели Project Navigator
  2. Выберите настройки вашего проекта в дереве «ПРОЕКТ»
  3. Перейдите на вкладку «Настройки сборки»
  4. Ищите «Уровень оптимизации», и вы увидите две настройки, одну для LLVM и одну для быстрой.
  5. Установите соответствующую настройку ( None [-O0]для LLVM и None [-0none]для Swift) для рассматриваемой конфигурации сборки.

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

Это решило это предупреждение для меня.

Альберт Бори
источник
1
Что со смешанными языковыми проектами ...?
Vive
В чем разница между LLVM и Swift? Является ли это , что Swift является то , что я написал в проекте и LLVM для что я делаю относительно отладки в отладчике то есть такие вещи , как po, p, expr...?
Мед
124

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

  • Нажмите на свою схему в верхнем левом углу Xcode.

Нажмите на свою схему в верхнем левом углу Xcode.

  • Выберите «Редактировать схему ...»

Выберите «Редактировать схему ...»

  • Нажмите на «Конфигурация сборки». и измените его в режим отладки.

Нажмите на «Конфигурация сборки».

NobodyNada
источник
8
Я использую отладку. и уверен, что оптимизатор выключен.
Мойтаба,
Это было интересно. Также из-за того, что он был установлен в режим Release, некоторые из моих точек останова не получали ударов, в то время как другие получали удар ¯_ (ツ) _ / ¯
Honey
60

Это предупреждение появляется только тогда, когда вы достигаете точки останова, а источник находится в проекте, где включена оптимизация, что не позволяет вам наблюдать реальные значения переменных (каждый объект отображается как ноль, даже если это не так)

В моем случае это происходило только при пошаговой отладке зависимости cocoapod.

Таким образом, даже если у вас правильно установлены основная цель и настройки проекта (Strip Debug Symbol = OFF, а уровень оптимизации - None), вам нужно убедиться, что он совпадает с проектом Pod, с которого вы достигли точки останова.

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

Gomino
источник
Прочитайте другие ответы, они предлагают то же самое. но они все выключены в моем проекте (иначе None [-O0])
Mojtaba
2
Я знаю, что вы сказали, что он отключен в вашем проекте, так же, как и в моем, но вы взглянули на конфигурацию ваших проектов зависимостей Pod?
Гомино
Та же проблема здесь с Xcode 7. Вероятно, проблема появилась, когда я начал использовать библиотеку trachkerbird. Но точка останова находится внутри моего собственного кода.
Майк
1
Для проекта Pods измените настройку уровня оптимизации "PROJECT" на None works. (без изменений для любой цели).
Упс
2
Это неверно Это будет отменено, когда вы pod installснова. Измени это так .
Юлиан
13

Оказывается, что после импорта старого проекта (Xcode 7.x +) в новый Xcode 8.3 (8E162), вероятно, из-за оптимизации компилятора, Swift Compiler - Optimization Level был по умолчанию установлен на Быструю оптимизацию одного файла :

Перед

Изменив его на нет, решил проблему:

после

Valvoline
источник
Я это сделал. Не работал для меня. Я сталкиваюсь с этой проблемой в сборке ios, созданной Unity.
Чандни
11

Editor-> Validate Settingsзатем подтвердите все изменения. Тогда вы должны получитьУровень оптимизации Swift Compiler на месте

Установите Debug в None.

Джеймс Са
источник
1
Я это сделал. Не работал для меня. Я сталкиваюсь с этой проблемой в сборке ios, созданной Unity.
Чандни
9

Это было решением для меня ...

В дополнение к ответу gimino, если вы используете cocoapods, добавьте такую ​​строку в Podfile:

xcodeproj 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug

или для версий cocoapods> = 1.0 (спасибо Diejmon)

project 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug

Где MyProject имеет «Debug - local», «Debug - staging», «Debug - PRODUCTION» в качестве конфигурации отладки в дополнение к стандартному «Debug»

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

Wils
источник
9

Я столкнулся с той же проблемой сегодня, и понял это (по крайней мере, в моем случае). Я также использую CocoaPods, и у меня была эта проблема при запуске моей цели тестирования (Swift, смешанный с ObjC).

Я использую Xcode 7.2, с iOS 9.2 SDK.

На изображении ниже вы можете увидеть оптимизации для цели и проекта до моего изменения:

уровень оптимизации до изменения

Удивительно, что несмотря на то, что разрешенная оптимизация отсутствует [-O0] , только после изменения настройки проекта с -Os на -O0 компилятор прекратил оптимизацию цели.

Ниже вы можете увидеть мои окончательные настройки:

уровень оптимизации после изменения

Андре Невес
источник
7

Это было давно, но я наконец решил проблему. Там не третий флаг оптимизации LTOили Link Time Optimizationи удивительно , никто уже упомянул об этом здесь и по какой - то причине я не обращать на это внимание либо. Это прямо над Optimization Levelнастройкой, как вы можете видеть на многих скриншотах, размещенных здесь.

Итак, подведем итог: есть 3 различных флага оптимизации, которые вы хотите отключить для отладки:

  • LLVM Link Time Optimization ( -flto)
  • Уровень оптимизации LLVM ( -O)
  • Уровень оптимизации компилятора Swift

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

Больше информации о LTO: http://llvm.org/docs/LinkTimeOptimization.html

Mojtaba
источник
2
Я это сделал. Не работал для меня. Я сталкиваюсь с этой проблемой в сборке ios, созданной Unity.
Чандни
@Chandni, здесь я столкнулся с той же проблемой, вы нашли решение?
Ранджани
2

Если вам нужно отключить оптимизацию для ваших модулей Swift, чтобы вы могли отлаживать их, добавьте следующее в свой Podfile. Это отключит оптимизацию только для отладочных сборок.

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      if config.name == "Debug"
        config.build_settings["SWIFT_OPTIMIZATION_LEVEL"] = "-Onone"
      end
    end
  end
end
Аль Прист
источник
1

Вы уверены, что ваша конфигурация отладки не оптимизирует код (не должен)? Похоже, вы случайно включили оптимизацию для конфигурации отладки, и вы должны отключить ее в настройках цели.

Кан Пойразоглу
источник
3
оптимизация отключена для всего. даже выпустить сборку, чтобы убедиться
Mojtaba
@Mojtba Но режим релиза включает оптимизацию!
NobodyNada
0

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

Таким образом, исправление должно было убедиться, что URL для запроса правильно сформирован. Больше информации о моем случае и аналогичных репортажах здесь тоже самое .

le0diaz
источник
0

Все, что я сделал, это очистил ( Product > Clean) мой проект и запустил его снова

Raed
источник
0

Это может быть упрощением, но вы строите для Release или с оптимизацией (которая удаляет символы из Swift или LLVM) слишком высоко? Если это так, отредактируйте схему и переключитесь на «Отладка» или измените параметры сборки для быстрой или LLVM-оптимизации на «Нет» (0).

Аарон
источник
0

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

Перейдите в настройки проекта Pods -> Ваша цель использования C -> Настройки сборки -> Apple Clang - Пользовательские флаги компилятора -> Другие флаги C и удалите -O3флаг, который каким-то образом туда попал.

Дмитрий Серов
источник