„Nazwa projektu” została skompilowana z optymalizacją - kroki mogą zachowywać się dziwnie; zmienne mogą być niedostępne

210

Próba wejścia w kod AFNetworking powoduje wygenerowanie następującego ostrzeżenia:

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

I oczywiście nie jestem w stanie debugować kodu. Mówiąc konkretnie, próbuję debugować UIImageView+AFNetworkingkategorię, która wydaje się niemożliwa. Zmiana kodu nie ma wpływu ( NSLogpróba itp.), A przy próbie wejścia w kompilatory przechodzi do kodu asemblera i pokazuje UIImageView+TVASTAFNetworkingjako nazwę kategorii, która nie istnieje nigdzie w bazie kodu.

wprowadź opis zdjęcia tutaj

Korzystanie z Xcode 7. iOS 9 i 8. Cocoapods (bez frameworka)

AKTUALIZACJA Zapomniałem wspomnieć, że Optymalizator jest ustawiony nonezarówno na konfigurację wydania, jak i debugowania i faktycznie używam Debugconfig.

wprowadź opis zdjęcia tutaj

AKTUALIZACJA 2

Strip Debug Symbols Jest również wyłączone.

Mojtaba
źródło
Pamiętam, że istnieje jakaś opcja „Strip Debug Symbols”. To prawdopodobnie spowodowałoby ten problem. Czy to jest wyłączone?
NobodyNada
1
@NobodyNada Tak Strip Debug Symbolsjest wyłączone.
Mojtaba
Dziwne, właśnie próbowałem włączyć Strip Strip Debug Symbol, a ostrzeżenie zniknęło 8- |
Gomino
@Mojtaba Hej, czy wiesz, jak rozwiązać problem?
Utknąłem
@Hadu: Niestety nie
Mojtaba,

Odpowiedzi:

175

Jeśli twój projekt korzysta z Swift, w konfiguracji projektu / celu istnieją dwa osobne ustawienia „Poziomu optymalizacji”.

Upewnij się, że oba zostały poprawnie ustawione:

  1. Wybierz projekt w panelu Nawigator projektu
  2. Wybierz ustawienia projektu w drzewie „PROJEKT”
  3. Kliknij kartę „Ustawienia kompilacji”
  4. Wyszukaj „Poziom optymalizacji”, a zobaczysz dwa ustawienia, jedno dla LLVM i jedno dla szybkiego.
  5. Ustaw odpowiednie ustawienie ( None [-O0]dla LLVM i None [-0none]Swift) dla danej konfiguracji kompilacji.

został skompilowany z krokami optymalizacji może zachowywać się dziwnie zmienne mogą być niedostępne

Takie postępowanie rozwiązało dla mnie to ostrzeżenie.

Albert Bori
źródło
1
Co z projektami mieszanymi językami ...?
Vive
Jaka jest różnica między LLVM i Swift? Czy to, że Swift to, co napisałem w projekcie i LLVM jest cokolwiek robię w odniesieniu do debugowania w debugger czyli rzeczy jak po, p, expr...?
Honey,
124

Wygląda na to, że Twój projekt jest w trybie zwolnienia. Tryb wydania kompiluje aplikację z wieloma optymalizacjami, ale debuggery nie znoszą optymalizacji, więc aby niezawodnie debugować aplikację, musisz przełączyć ją w tryb debugowania, który zmniejsza optymalizację i dodaje garść informacji debugujących. Aby przełączyć go w tryb debugowania:

  • Kliknij schemat w lewym górnym rogu Xcode.

Kliknij schemat w lewym górnym rogu Xcode.

  • Wybierz „Edytuj schemat ...”

Wybierz „Edytuj schemat ...”

  • Kliknij menu „Kompiluj konfigurację”. i zmień go w tryb debugowania.

Kliknij menu „Kompiluj konfigurację”.

NobodyNada
źródło
8
Używam debugowania. i na pewno optymalizator jest WYŁĄCZONY.
Mojtaba
To było interesujące. Również dlatego, że ustawiłem go w tryb zwolnienia , niektóre moje punkty przerwania nie zostały trafione, a inne zostały trafione ¯_ (ツ) _ / ¯
Honey
59

To ostrzeżenie pojawia się tylko wtedy, gdy osiągniesz punkt przerwania, a źródło znajduje się w projekcie, w którym włączono optymalizację, uniemożliwiając obserwowanie rzeczywistych wartości zmiennych (każdy obiekt jest wyświetlany jako zero, nawet jeśli nie jest)

W moim przypadku zdarzyło się to tylko podczas debugowania krok po kroku przez zależność cocoapod.

Tak więc, nawet jeśli prawidłowo ustawiono główny cel i ustawienia projektu (Symbol debugowania pasma = WYŁ., A poziom optymalizacji Brak), musisz upewnić się, że jest taki sam dla projektu kapsuły, z którego uderza punkt przerwania.

wprowadź opis zdjęcia tutaj

Gomino
źródło
Przeczytaj inne odpowiedzi, sugerują to samo. ale wszystkie są wyłączone w moim projekcie (alias None [-O0])
Mojtaba
2
Wiem, że powiedziałeś, że to jest wyłączone w twoim projekcie, tak jak było w moim, ale czy spojrzałeś na konfigurację swoich projektów zależności Pod?
Gomino
Ten sam problem tutaj z Xcode 7. Prawdopodobnie problem pojawił się, kiedy zacząłem używać biblioteki trachkerbird. Ale punkt przerwania znajduje się w moim własnym kodzie.
Mike
1
W przypadku projektu Pods zmień ustawienie poziomu optymalizacji „PROJEKT” na Brak. (bez zmian dla żadnego celu strąków).
ooops
2
To jest niepoprawne. Zostanie zastąpione, gdy pod installponownie. Zmień to w ten sposób .
Iulian Onofrei
13

Okazuje się, że po zaimportowaniu starego projektu (Xcode 7.x +) do nowego Xcode 8.3 (8E162), prawdopodobnie ze względu na optymalizację kompilatora, Swift Compiler - Optimization Level został domyślnie ustawiony na Fast, Single-File Optimization :

Przed

Zmiana na brak rozwiązała problem:

po

walwolina
źródło
Ja to zrobiłem. Nie działało dla mnie. Mam do czynienia z tym problemem w kompilacji iOS, która jest generowana przez Unity.
Chandni
11

Editor-> Validate Settingsnastępnie potwierdź wszystkie zmiany. Więc powinieneś dostaćObowiązuje poziom optymalizacji kompilatora Swift

Ustaw opcję Debuguj na None.

James sa
źródło
1
Ja to zrobiłem. Nie działało dla mnie. Mam do czynienia z tym problemem w kompilacji iOS, która jest generowana przez Unity.
Chandni
9

To było dla mnie rozwiązanie ...

Wzdłuż linii odpowiedzi gimino, jeśli używasz cocoapodów, dodaj taką linię do Podfile:

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

lub dla wersji cocoapods> = 1.0 (dzięki Diejmon)

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

Gdzie MyProject ma „Debugowanie - lokalne”, „Debugowanie - przemieszczanie”, „Debugowanie - PRODUKCJA” jako konfiguracje debugowania oprócz standardowego „Debugowania”

Domyślnie cocoapods zwykle generują konfiguracje kapsuł jako Release, ta linia Podfile pozwala ci powiedzieć, że są debugowane.

Wils
źródło
9

Natknąłem się dziś na ten sam problem i wymyśliłem go (przynajmniej w moim przypadku). Używam również CocoaPods i miałem ten problem podczas uruchamiania mojego testowego celu (Swift zmieszany z ObjC).

Używam Xcode 7.2, z iOS 9.2 SDK.

Na poniższym obrazku widać optymalizacje celu i projektu przed moją zmianą:

poziom optymalizacji przed zmianą

Zaskakujące jest to, że mimo że optymalizacją jest Brak [-O0] , dopiero po zmianie ustawienia projektu z -Os na -O0 kompilator przestał optymalizować cel.

Poniżej możesz zobaczyć moje ostateczne ustawienia:

poziom optymalizacji po zmianie

André Neves
źródło
7

Minęło dużo czasu, ale w końcu udało mi się rozwiązać problem. Jest trzecia flaga optymalizacji LTOlub Link Time OptimizationZaskakująco nikt o niej nie wspominał iz jakiegoś powodu też nie zwróciłem na nią uwagi. Jest tuż nad Optimization Levelustawieniem, jak widać na wielu zrzutach ekranu tutaj.

Podsumowując, istnieją 3 różne flagi optymalizacji, które chcesz wyłączyć w celu debugowania:

  • Optymalizacja czasu łącza LLVM ( -flto)
  • Poziom optymalizacji LLVM ( -O)
  • Poziom optymalizacji kompilatora Swift

wprowadź opis zdjęcia tutaj

Więcej informacji o LTO: http://llvm.org/docs/LinkTimeOptimization.html

Mojtaba
źródło
2
Ja to zrobiłem. Nie działało dla mnie. Mam do czynienia z tym problemem w kompilacji iOS, która jest generowana przez Unity.
Chandni
@Chandni, tutaj napotkałem ten sam problem, czy znalazłeś rozwiązanie?
Ranjani
2

Jeśli musisz wyłączyć optymalizacje dla swoich kapsuł Swift, aby móc debugować w nich, dodaj następujące elementy do swojego Podfile. Spowoduje to wyłączenie optymalizacji tylko dla kompilacji debugowania.

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
Al Priest
źródło
1

Czy na pewno konfiguracja debugowania nie optymalizuje kodu (nie powinna)? Wygląda na to, że przypadkowo włączyłeś optymalizacje konfiguracji debugowania i powinieneś wyłączyć ją z ustawień celu.

Can Poyrazoğlu
źródło
3
optymalizacja jest wyłączona dla wszystkiego. nawet wypuść wersję, aby się upewnić
Mojtaba
@Mojtba Ale tryb wydania włącza optymalizacje!
NobodyNada
0

Ten błąd zdarzył mi się dwa razy i w każdym przypadku wystąpił błąd w parametrze URL używanym do żądania usługi. W jednym przypadku adres URL miał trochę miejsca w sekcji portu, w drugim przypadku pewna wartość opcjonalna nie była rozpakowywana.

Dlatego poprawką było upewnienie się, że adres URL żądania jest poprawnie sformułowany. Więcej informacji o mojej sprawie i podobne zgłaszanie tego samego tutaj .

le0diaz
źródło
0

Wszystko, co zrobiłem, to wyczyszczenie ( Product > Clean) mojego projektu i uruchomienie go ponownie

raed
źródło
0

Może to być nadmierne uproszczenie, ale czy budujesz dla wydania lub z optymalizacją (która usuwa symbole z Swift lub LLVM) zbyt wysoko? Jeśli tak, edytuj swój schemat i przejdź do Debugowania lub edytuj Ustawienia kompilacji dla szybkiej optymalizacji LLVM na Brak (0).

Aaron
źródło
0

Na wypadek, gdyby ktoś napotkał ten problem podczas debugowania zasobnika, który korzysta wewnętrznie z biblioteki C, istnieje inna rzecz, którą musisz zmienić w ustawieniach projektu, aby działał on oprócz wszystkich innych wymienionych w wątku.

Przejdź do ustawień projektu Pods -> Twój cel C-using -> Ustawienia kompilacji -> Apple Clang - Niestandardowe flagi kompilatora -> Inne flagi C i usuń -O3flagę, która jakoś tam dotarła.

Dmitrij Serow
źródło