'Projektname' wurde mit Optimierung zusammengestellt - Schritte können sich merkwürdig verhalten; Variablen sind möglicherweise nicht verfügbar

210

Beim Versuch, in den AFNetworking-Code einzusteigen, wird folgende Warnung generiert:

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

Und natürlich kann ich den Code nicht debuggen. Um genau zu sein, versuche ich, eine UIImageView+AFNetworkingKategorie zu debuggen, was unmöglich erscheint. Das Ändern des Codes hat keine Auswirkung (versucht NSLogusw.). Wenn Sie versuchen, in Compiler einzusteigen, wird der Assemblycode aufgerufen und UIImageView+TVASTAFNetworkingals Kategoriename angezeigt, der an keiner Stelle in der Codebasis vorhanden ist.

Geben Sie hier die Bildbeschreibung ein

Verwenden von Xcode 7. iOS 9 & 8. Cocoapods (kein Framework)

UPDATE Ich habe vergessen zu erwähnen, dass Optimizer nonesowohl für die Release- als auch für die Debug-Konfiguration eingestellt ist, und ich verwende tatsächlich Debugconfig.

Geben Sie hier die Bildbeschreibung ein

UPDATE 2

Strip Debug Symbols Ist auch aus.

Mojtaba
quelle
Ich erinnere mich, dass es eine Art "Strip Debug Symbols" -Option gibt. Das würde wahrscheinlich dieses Problem verursachen. Ist es aus?
NobodyNada
1
@NobodyNada Ja Strip Debug Symbolsist aus.
Mojtaba
Seltsam Ich habe gerade versucht, das Strip-Debug-Symbol einzuschalten, und die Warnung verschwand 8- |
Gomino
@ Mojtaba Hey, hast du herausgefunden, wie du das Problem lösen kannst? Ich stecke mit dem gleichen Problem fest, seit ich auf Xcode 7
Hadu
@ Hadu: Leider nein
Mojtaba

Antworten:

175

Wenn Ihr Projekt Swift verwendet, gibt es in der Projekt- / Zielkonfiguration zwei separate Einstellungen für "Optimierungsstufe".

Stellen Sie sicher, dass Sie beide richtig eingestellt haben:

  1. Wählen Sie Ihr Projekt im Bereich Projektnavigator aus
  2. Wählen Sie die Einstellungen Ihres Projekts im Baum "PROJEKT"
  3. Klicken Sie auf die Registerkarte "Build Settings"
  4. Suchen Sie nach "Optimierungsstufe" und Sie sehen zwei Einstellungen, eine für LLVM und eine für Swift.
  5. Stellen Sie die entsprechende Einstellung ( None [-O0]für LLVM und None [-0none]für Swift) für die betreffende Build-Konfiguration ein.

wurde mit Optimierungsschritten kompiliert, kann sich merkwürdig verhalten. Variablen sind möglicherweise nicht verfügbar

Dadurch wurde diese Warnung für mich behoben.

Albert Bori
quelle
1
Was ist mit gemischten Sprachprojekten ...?
Vive
Was ist der Unterschied zwischen LLVM & Swift? Ist es , dass Swift ist das, was ich in dem Projekt geschrieben und LLVM ist für alles , was ich in Bezug täte in den Debugger also Dinge zu debuggen wie po, p, expr...?
Honig
124

Es sieht so aus, als ob sich Ihr Projekt im Release-Modus befindet. Der Release-Modus kompiliert die App mit vielen Optimierungen, aber Debugger hassen Optimierungen. Um die App zuverlässig zu debuggen, müssen Sie sie in den Debug-Modus schalten, der die Optimierung reduziert und eine Reihe von Debugging-Informationen hinzufügt. So wechseln Sie in den Debug-Modus:

  • Klicken Sie auf Ihr Schema in der oberen linken Ecke von Xcode.

Klicken Sie auf Ihr Schema in der oberen linken Ecke von Xcode.

  • Wählen Sie "Schema bearbeiten ..."

Wählen Sie "Schema bearbeiten ..."

  • Klicken Sie auf die Dropdown-Liste "Konfiguration erstellen". und ändern Sie es in den Debug-Modus.

Klicken Sie auf die Dropdown-Liste "Konfiguration erstellen".

NobodyNada
quelle
8
Ich benutze Debug. und sicher, dass der Optimierer ausgeschaltet ist.
Mojtaba
Das war interessant. Auch weil ich es auf den Release- Modus eingestellt hatte, wurden einige meiner Haltepunkte nicht getroffen, während andere getroffen wurden ¯_ (ツ) _ / ¯
Honey
59

Diese Warnung wird nur angezeigt, wenn Sie einen Haltepunkt erreichen und sich die Quelle in einem Projekt befindet, in dem die Optimierung aktiviert ist, sodass Sie keine echten Variablenwerte anzeigen können (jedes Objekt wird als Null angezeigt, auch wenn dies nicht der Fall ist).

In meinem Fall geschah dies nur beim schrittweisen Debuggen durch eine Cocoapod-Abhängigkeit.

Selbst wenn Sie Ihre Hauptziel- und Projekteinstellungen richtig eingestellt haben (Strip-Debug-Symbol = AUS und Optimierungsstufe Keine), müssen Sie sicherstellen, dass es für das Pod-Projekt, von dem aus Sie den Haltepunkt erreichen, dasselbe ist.

Geben Sie hier die Bildbeschreibung ein

Gomino
quelle
Lesen Sie andere Antworten, sie schlagen dasselbe vor. aber sie sind alle weg in meinem Projekt (aka None [-O0])
Mojtaba
2
Ich weiß, dass Sie gesagt haben, dass es in Ihrem Projekt nicht funktioniert, genau wie in meinem, aber haben Sie sich die Konfiguration Ihrer Pod-Abhängigkeitsprojekte angesehen?
Gomino
Gleiches Problem hier mit Xcode 7. Wahrscheinlich trat das Problem auf, als ich anfing, die Trachkerbird-Bibliothek zu verwenden. Der Haltepunkt befindet sich jedoch in meinem eigenen Code.
Mike
1
Ändern Sie für das Pods-Projekt die Einstellung für die Optimierungsstufe "PROJEKT" in "Keine funktioniert". (Keine Änderungen für ein Pod-Ziel).
ooops
2
Das ist falsch. Es wird überschrieben, wenn Sie pod installwieder. Ändere es so .
Iulian Onofrei
13

Es stellt sich heraus, dass nach dem Importieren eines alten Projekts (Xcode 7.x +) in neuen Xcode 8.3 (8E162), wahrscheinlich aufgrund der Compileroptimierung, die Swift Compiler - Optimierungsstufe standardmäßig auf Schnelle Optimierung einzelner Dateien festgelegt wurde :

Vor

Wenn Sie es in "Keine" ändern, wurde das Problem behoben:

nach dem

Valvolin
quelle
Ich hab es gemacht. Hat bei mir nicht funktioniert. Ich bin mit diesem Problem in ios build konfrontiert, das von Unity generiert wird.
Chandni
11

Editor-> Validate Settingsdann alle Änderungen bestätigen. Dann solltest du bekommenSchnelle Compiler-Optimierungsstufe vorhanden

Setzen Sie Debug auf None.

James Sa.
quelle
1
Ich hab es gemacht. Hat bei mir nicht funktioniert. Ich bin mit diesem Problem in ios build konfrontiert, das von Unity generiert wird.
Chandni
9

Das war die Lösung für mich ...

Wenn Sie gemäß der Antwort von Gimino Cocoapods verwenden, fügen Sie dem Podfile eine Zeile wie diese hinzu:

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

oder für Cocoapods Versionen> = 1.0 (danke Diejmon)

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

Wobei MyProject zusätzlich zum Standard-Debug "Debug - lokal", "Debug - Staging", "Debug - PRODUCTION" als Debug-Konfigurationen hat.

Standardmäßig generieren Cocoapods normalerweise Pod-Konfigurationen als Release. In dieser Podfile-Zeile können Sie angeben, dass sie debuggen.

wils
quelle
9

Ich bin heute auf dasselbe Problem gestoßen und habe es herausgefunden (zumindest in meinem Fall). Ich verwende auch CocoaPods und hatte dieses Problem beim Ausführen meines Testziels (Swift gemischt mit ObjC).

Ich verwende Xcode 7.2 mit iOS 9.2 SDK.

Im Bild unten sehen Sie die Optimierungen für das Ziel und das Projekt vor meiner Änderung:

Optimierungsstufe vor Änderung

Das Überraschende ist, dass der Compiler die Optimierung des Ziels erst nach dem Ändern der Projekteinstellung von -Os auf -O0 beendet hat , obwohl die aufgelöste Optimierung None [-O0] ist .

Unten sehen Sie meine endgültigen Einstellungen:

Optimierungsstufe nach Änderung

André Neves
quelle
7

Es ist lange her, aber ich habe das Problem endlich gelöst. Es gibt ein drittes Optimierungsflag LTOoder Link Time Optimizationund Überraschenderweise hat es hier niemand erwähnt und aus irgendeinem Grund habe ich es auch nicht beachtet. Es befindet sich genau dort über der Optimization LevelEinstellung, wie Sie in vielen hier veröffentlichten Screenshots sehen können.

Zusammenfassend gibt es drei verschiedene Optimierungsflags, die Sie zum Debuggen deaktivieren möchten:

  • LLVM Link Time Optimization ( -flto)
  • LLVM-Optimierungsstufe ( -O)
  • Swift Compiler Optimization Level

Geben Sie hier die Bildbeschreibung ein

Weitere Informationen zu LTO: http://llvm.org/docs/LinkTimeOptimization.html

Mojtaba
quelle
2
Ich hab es gemacht. Hat bei mir nicht funktioniert. Ich bin mit diesem Problem in ios build konfrontiert, das von Unity generiert wird.
Chandni
@Chandni, hier stand ich vor dem gleichen Problem, hast du die Lösung gefunden?
Ranjani
2

Wenn Sie Optimierungen für Ihre Swift-Pods deaktivieren müssen, damit Sie sie debuggen können, fügen Sie Folgendes zu Ihrem hinzu Podfile. Dadurch werden die Optimierungen nur für Debug-Builds deaktiviert.

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 Priester
quelle
1

Sind Sie sicher, dass Ihre Debug-Konfiguration den Code nicht optimiert (sollte es nicht)? Es sieht so aus, als hätten Sie versehentlich Optimierungen für die Debug-Konfiguration aktiviert und sollten diese in den Einstellungen des Ziels deaktivieren.

Kann Poyrazoğlu
quelle
3
Optimierung ist für alles aus. sogar Release Build nur um sicher zu gehen
Mojtaba
@ Mojtba Aber der Release-Modus aktiviert Optimierungen!
NobodyNada
0

Dieser Fehler ist mir zweimal passiert und war in jedem Fall ein Fehler im URL-Parameter, der zum Anfordern eines Dienstes verwendet wurde. In einem Fall hatte die URL etwas Platz im Portabschnitt, in dem anderen Fall wurde ein optionaler Wert nicht entpackt.

Das Update sollte also sicherstellen, dass die URL für die Anfrage gut formuliert ist. Weitere Informationen zu meinem Fall und ähnliche Berichte finden Sie hier .

le0diaz
quelle
0

Ich habe lediglich Product > Cleanmein Projekt bereinigt ( ) und erneut ausgeführt

raed
quelle
0

Dies mag eine übermäßige Vereinfachung sein, aber bauen Sie für Release oder mit einer zu hohen Optimierung (die Symbole aus Swift oder LLVM entfernt)? Wenn ja, bearbeiten Sie Ihr Schema und wechseln Sie zu Debug, oder bearbeiten Sie Ihre Build-Einstellungen für die schnelle oder LLVM-Optimierung auf Keine (0).

Aaron
quelle
0

Nur für den Fall, dass jemand beim Debuggen eines Pods, der intern eine C-Bibliothek verwendet, auf dieses Problem stößt, müssen Sie zusätzlich zu allen anderen im Thread aufgeführten Elementen noch etwas in den Projekteinstellungen ändern, damit es funktioniert.

Gehen Sie zu Pods-Projekteinstellungen -> Ihr C-verwendendes Ziel -> Build-Einstellungen -> Apple Clang - Benutzerdefinierte Compiler-Flags -> Andere C-Flags und entfernen Sie das -O3Flag, das irgendwie dort angekommen ist.

Dmitry Serov
quelle