"Назва проекту" була складена з оптимізацією - крокування може вести себе дивно; змінні можуть бути недоступними


210

Намагаючись перейти до коду 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для конфігурації випуску, так і для налагодження, і я фактично використовую Debugconfig.

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

ОНОВЛЕННЯ 2

Strip Debug Symbols Вимкнено також.


Я пригадую, там був якийсь варіант "Символи налагодження смужок". Це, мабуть, спричинило б цю проблему. Це вимкнено?
НіхтоНада

1
@NobodyNada Так Strip Debug Symbols, вимкнено.
Мойтаба

Дивно, що я просто намагався ввімкнути символ налагодження смужок, і попередження зникло 8- |
Гоміно

@Mojtaba Ей, ти дізнався, як вирішити проблему? Я застряг у тій же проблемі з моменту оновлення до Xcode 7
Хаду

@Hadu: На жаль, ні
Mojtaba

Відповіді:


175

Якщо у вашому проекті використовується Swift, у налаштуваннях проекту / цілі є два окремі налаштування "Рівень оптимізації".

Переконайтесь, що ви обидва встановили їх правильно:

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

був складений з оптимізацією кроків може поводитись невідмінно змінними можуть бути недоступними

Це вирішило це попередження для мене.


1
Що з змішаними мовними проектами ...?
Vive

Яка різниця між LLVM та Swift? Є чи це , що Swift є те , що я написав у проекті і LLVM для що я роблю щодо налагодження в отладчике тобто такі речі , як po, p, expr...?
Мед

124

Схоже, ваш проект знаходиться в режимі випуску. Режим випуску збирає додаток з великою кількістю оптимізацій, але налагоджувачі ненавидять оптимізацію, тому для надійної налагодження програми потрібно переключити його в режим налагодження, що зменшує оптимізацію та додає купу інформації про налагодження. Щоб переключити його в режим налагодження:

  • Клацніть на схему у верхньому лівому куті Xcode.

Клацніть на схему у верхньому лівому куті Xcode.

  • Виберіть "Редагувати схему ..."

Виберіть "Редагувати схему ..."

  • Натисніть спадне меню "Конфігурація побудови". і змінити його в режимі налагодження.

Натисніть спадне меню "Конфігурація побудови".


8
Я використовую налагодження. і впевнений, що оптимізатор вимкнено.
Мойтаба

Це було цікаво. Також тому, що я встановив його в режимі випуску, деякі з моїх точок перерви не потрапляли, а інші потрапляли ¯_ (ツ) _ / ¯
мед

59

Це попередження з’являється лише тоді, коли ви потрапили на точку розриву, і джерело знаходиться в проекті, де ввімкнена оптимізація, що не дозволяє вам переглядати реальні змінні значення (кожен об'єкт відображається як нуль, навіть якщо його немає)

У моєму випадку це сталося лише при налагодженні крок за кроком через залежність від какаоподу.

Тож навіть якщо у вас встановлені правильно встановлені основні цілі та параметри проекту (Символ налагодження смуг = ВИКЛ., А рівень оптимізації немає), вам потрібно переконатися, що вони однакові для проекту "Під", з якого ви потрапили.

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


Прочитайте інші відповіді, вони пропонують те саме. але вони все в моєму проекті (ака None [-O0])
Мойтаба

2
Я знаю, ви сказали, що це не виходить у вашому проекті, як і в моєму, але ви подивилися на конфігурацію своїх проектів залежностей від Pod?
Гоміно

Ця ж проблема і з Xcode 7. Можливо, проблема з’явилася, коли я почав використовувати бібліотеку trachkerbird. Але точка розриву знаходиться всередині мого власного коду.
Майк

1
Для проекту Pods змініть налаштування рівня оптимізації "ПРОЕКТ" на "Нічого не працює". (жодних змін для жодної цілі стручка).
ooops

2
Це неправильно. Він перекриється, коли ви pod installзнову. Змініть це так .
Юліан Онофрей

13

Виявляється, що після імпорту старого проекту (Xcode 7.x +) до нового Xcode 8.3 (8E162), ймовірно, завдяки оптимізації компілятора, Swift Compiler - рівень оптимізації був встановлений за замовчуванням для швидкої однофайлової оптимізації :

До цього

Змінивши його на жодне, вирішив проблему:

після


Я зробив це. Не працював для мене. Я зіткнувся з цим питанням у ios build, який генерується Unity.
Чандні

11

Editor-> Validate Settingsтоді підтвердьте всі зміни. Тоді ви повинні отриматиШвидкий рівень оптимізації компілятора

Установіть налагодження на None.


1
Я зробив це. Не працював для мене. Я зіткнувся з цим питанням у ios build, який генерується Unity.
Чандні

9

Це було рішенням для мене ...

По лінії відповіді gimino, якщо ви використовуєте cocoapods, додайте такий рядок до Podfile:

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

або для какао-версій> = 1,0 (спасибі Diejmon)

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

Де MyProject має "Налагодження - локальний", "Налагодження - постановка", "Налагодження - ВИРОБНИЦТВО" як конфігурації налагодження на додаток до стандартної "Налагодження"

За замовчуванням cocoapods зазвичай генерує конфігурації стручків як Release, цей рядок Podfile дозволяє вказати, що вони налагоджені.


9

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

Я використовую Xcode 7.2, з iOS 9.2 SDK.

На зображенні нижче ви можете побачити оптимізацію для цілі та проекту до моєї зміни:

рівень оптимізації перед зміною

Дивовижним є те, що хоча розв'язана оптимізація не є [-O0] , лише після зміни налаштування проекту з -Os на -O0 компілятор перестав оптимізувати ціль.

Нижче ви можете побачити мої остаточні налаштування:

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


7

Минуло багато часу, але я остаточно вирішив питання. Є третій прапор оптимізації LTOабо, на Link Time Optimizationдиво, тут ніхто не згадував, і я чомусь не звернув на це уваги. Це прямо тамOptimization Level налаштуваннями, як ви можете бачити на багатьох екранах, розміщених тут.

Отже, підсумовуючи це, є три різних прапора оптимізації, які ви хочете вимкнути для налагодження:

  • Оптимізація часу зв'язку LLVM ( -flto)
  • Рівень оптимізації LLVM ( -O)
  • Швидкий рівень оптимізації компілятора

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

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


2
Я зробив це. Не працював для мене. Я зіткнувся з цим питанням у ios build, який генерується Unity.
Чандні

@Chandni, Тут я зіткнувся з тією ж проблемою, ти знайшов рішення?
Ranjani

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 Але режим випуску вмикає оптимізацію!
НіхтоNada

0

Ця помилка трапилася зі мною двічі, і в кожному випадку була помилка в параметрі URL, який використовується для запиту послуги. В одному випадку URL-адреса мала деякий простір у розділі порту, в іншому випадку деяку необов’язкове значення не було розгорнуто.

Таким чином, виправлення повинно було бути впевненим, що URL-адреса для запиту добре сформована. Більше інформації про мій випадок та подібне повідомлення про те саме тут .


0

Все, що я зробив - це очистити Product > Cleanмій проект і запустити його знову


0

Це може бути надмірним спрощенням, але ви будуєте для випуску або з оптимізацією (яка видаляє символи з Swift або LLVM) занадто високою? Якщо так, відредагуйте схему та перейдіть на налагодження, або відредагуйте Параметри збирання для швидкої чи оптимізації LLVM на None (0).


0

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

Перейдіть до налаштувань проекту Pods -> Ваша ціль, що використовує С -> Налаштування збірки -> Apple Clang - Прапорці спеціального компілятора -> Інші прапори C та видаліть -O3прапор, який якимось чином потрапив туди.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.