Il "Nome progetto" è stato compilato con l'ottimizzazione: lo stepping potrebbe comportarsi in modo strano; le variabili potrebbero non essere disponibili


211

Il tentativo di entrare nel codice di rete AF genera il seguente avviso:

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

E ovviamente non sono in grado di eseguire il debug del codice. Per essere precisi sto cercando di eseguire il debug della UIImageView+AFNetworkingcategoria che sembra impossibile. La modifica del codice non ha alcun effetto (provato NSLog, ecc.) E quando si tenta di inserire i compilatori si passa al codice assembly e viene visualizzato UIImageView+TVASTAFNetworkingcome nome della categoria che non esiste in alcun punto della base di codice.

inserisci qui la descrizione dell'immagine

Utilizzo di Xcode 7. iOS 9 e 8. Cocoapods (no Framework)

AGGIORNAMENTO Ho dimenticato di menzionare che Optimizer è impostato nonesu sia per la configurazione di rilascio che di debug e in effetti sto usando DebugConfig.

inserisci qui la descrizione dell'immagine

AGGIORNAMENTO 2

Strip Debug Symbols Anche spento.


Ricordo che esisteva una sorta di opzione "Strip Debug Symbols". Ciò probabilmente causerebbe questo problema. È spento?
Nessuno Nada,

1
@NobodyNada Sì Strip Debug Symbolsè spento.
Mojtaba,

Strano, ho appena provato ad attivare il simbolo di debug della striscia e l'avvertimento è scomparso 8- |
Gomino,

@Mojtaba Ehi, hai scoperto come risolvere il problema? Sono bloccato con lo stesso problema
dall'aggiornamento

@Hadu: Purtroppo no
Mojtaba,

Risposte:


176

Se il tuo progetto utilizza Swift, ci sono due impostazioni "Livello di ottimizzazione" separate nella configurazione del progetto / target.

Assicurati di averli impostati entrambi correttamente:

  1. Seleziona il tuo progetto nel riquadro Navigatore progetti
  2. Seleziona le impostazioni del tuo progetto sotto l'albero "PROGETTO"
  3. Fai clic sulla scheda "Impostazioni build"
  4. Cerca "Livello di ottimizzazione" e vedrai due impostazioni, una per LLVM e una per rapido.
  5. Configurare l'impostazione appropriata ( None [-O0]per LLVM e None [-0none]per Swift) per la configurazione build in questione.

è stato compilato con l'ottimizzazione stepping potrebbe comportarsi in modo anomalo e potrebbe non essere disponibile

In questo modo ho risolto quell'avvertimento per me.


1
Cosa succede con i progetti in lingua mista ...?
Vive il

Qual è la differenza tra LLVM e Swift? E 'che Swift è quello che ho scritto nel progetto e LLVM è per tutto quello che sto facendo per quanto riguarda il debug nel debugger vale a dire le cose come po, p, expr...?
Miele

124

Sembra che il tuo progetto sia in modalità Rilascio. La modalità di rilascio compila l'app con molte ottimizzazioni, ma i debugger odiano le ottimizzazioni, quindi per eseguire il debug in modo affidabile dell'app, è necessario passare alla modalità di debug che riduce l'ottimizzazione e aggiunge un sacco di informazioni di debug. Per passare alla modalità Debug:

  • Fai clic sul tuo schema nell'angolo in alto a sinistra di Xcode.

Fai clic sul tuo schema nell'angolo in alto a sinistra di Xcode.

  • Seleziona "Modifica schema ..."

Seleziona "Modifica schema ..."

  • Fai clic sul menu a discesa "Configurazione build". e cambiarlo in modalità Debug.

Fai clic sul menu a discesa "Configurazione build".


8
Sto usando il debug. e sicuramente l'ottimizzatore è spento.
Mojtaba,

Questo è stato interessante Anche perché avevo impostato la modalità di rilascio , alcuni dei miei punti di interruzione non venivano colpiti mentre altri venivano colpiti ¯_ (ツ) _ / ¯
Miele

60

Questo avviso viene visualizzato solo quando si raggiunge un punto di interruzione e l'origine si trova in un progetto in cui l'ottimizzazione è abilitata, impedendo di guardare valori di variabili reali (ogni oggetto viene mostrato come zero, anche se non lo è)

Nel mio caso, è successo solo durante il debug passo dopo passo attraverso una dipendenza cocoapod.

Pertanto, anche se le impostazioni di destinazione e progetto principali sono impostate correttamente (Strip Debug Symbol = OFF e Livello di ottimizzazione Nessuno), è necessario assicurarsi che sia lo stesso per il progetto Pod da cui si sta colpendo il breakpoint.

inserisci qui la descrizione dell'immagine


Leggi altre risposte, stanno suggerendo lo stesso. ma sono tutti fuori nel mio progetto (aka None [-O0])
Mojtaba,

2
So che hai detto che è disattivato nel tuo progetto, proprio come lo era nel mio, ma hai dato un'occhiata alla configurazione dei tuoi progetti di dipendenze Pod?
Gomino,

Stesso problema qui con Xcode 7. Probabilmente il problema è apparso quando ho iniziato a usare la libreria trachkerbird. Ma il punto di interruzione si trova nel mio codice.
Mike,

1
Per il progetto Pods, modificare l'impostazione del livello di ottimizzazione "PROJECT" su Nessuno funziona. (nessuna modifica per nessun target pod).
ooops, il

2
Questo non è corretto Verrà ignorato quando di pod installnuovo. Cambialo in questo modo .
Iulian Onofrei,

13

Si scopre che dopo aver importato un vecchio progetto (Xcode 7.x +) nel nuovo Xcode 8.3 (8E162), probabilmente a causa dell'ottimizzazione del compilatore, il compilatore Swift - Livello di ottimizzazione è stato impostato per impostazione predefinita su Ottimizzazione rapida a file singolo :

Prima

Modificandolo in nessuno, risolto il problema:

dopo


L'ho fatto. Non ha funzionato per me. Sto affrontando questo problema in iOS build che è generato da Unity.
Chandni,

11

Editor-> Validate Settingsquindi confermare tutte le modifiche. Quindi dovresti ottenereRapido livello di ottimizzazione del compilatore in atto

Impostare Debug su None.


1
L'ho fatto. Non ha funzionato per me. Sto affrontando questo problema in iOS build che è generato da Unity.
Chandni,

9

Questa è stata la soluzione per me ...

Sulla falsariga della risposta di gimino, se stai usando cocoapods, aggiungi una linea come questa al Podfile:

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

o per le versioni di cocoapods> = 1.0 (grazie Diejmon)

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

Dove MyProject ha "Debug - local", "Debug - staging", "Debug - PRODUCTION" come configurazioni di debug oltre allo "Debug" standard

Per impostazione predefinita, i cocoapod generano generalmente configurazioni di pod come Release, questa linea Podfile ti consente di dire che sono debug.


9

Oggi ho riscontrato lo stesso problema e l'ho capito (almeno nel mio caso). Uso anche CocoaPods e ho riscontrato questo problema durante l'esecuzione del mio obiettivo di test (Swift miscelato con ObjC).

Sto usando Xcode 7.2, con iOS 9.2 SDK.

Nell'immagine seguente, puoi vedere le ottimizzazioni per l'obiettivo e il progetto prima della mia modifica:

livello di ottimizzazione prima del cambiamento

La cosa sorprendente è che anche se l'ottimizzazione risolta è Nessuna [-O0] , solo dopo aver modificato l'impostazione del progetto da -Os a -O0 il compilatore ha smesso di ottimizzare l'obiettivo.

Di seguito puoi vedere le mie impostazioni finali:

livello di ottimizzazione dopo il cambiamento


7

È passato molto tempo ma alla fine ho risolto il problema. C'è una terza bandiera di ottimizzazione LTOo, Link Time Optimizationsorprendentemente, nessuno l'ha menzionata qui e per qualche ragione non ci ho fatto caso. È proprio lì sopra ilOptimization Level impostazione come puoi vedere in molte schermate pubblicate qui.

Quindi per riassumere ci sono 3 diversi flag di ottimizzazione che si desidera disattivare per il debug:

  • LLVM Link Time Optimization ( -flto)
  • Livello di ottimizzazione LLVM (-O )
  • Livello di ottimizzazione del compilatore rapido

inserisci qui la descrizione dell'immagine

Ulteriori informazioni su LTO: http://llvm.org/docs/LinkTimeOptimization.html


2
L'ho fatto. Non ha funzionato per me. Sto affrontando questo problema in iOS build che è generato da Unity.
Chandni,

@Chandni, qui ho riscontrato lo stesso problema hai trovato la soluzione?
Ranjani,

2

Se devi disabilitare le ottimizzazioni per i tuoi pod Swift in modo da poter eseguire il debug in essi, aggiungi quanto segue al tuo Podfile. Ciò disabiliterà le ottimizzazioni solo per build di debug.

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

Sei sicuro che la tua configurazione di debug non ottimizzi il codice (non dovrebbe)? Sembra che tu abbia abilitato accidentalmente le ottimizzazioni per la configurazione del debug e dovresti disattivarlo dalle impostazioni del target.


3
l'ottimizzazione è disattivata per tutto. rilasciare anche build solo per essere sicuri
Mojtaba,

@Mojtba Ma la modalità di rilascio attiva le ottimizzazioni!
NobodyNada,

0

Questo errore mi è successo due volte e in ogni caso è stato un errore nel parametro URL utilizzato per richiedere un servizio. In un caso l'URL aveva un po 'di spazio nella sezione della porta, nell'altro caso un valore facoltativo non veniva scartato.

Quindi la correzione era assicurarsi che l'URL della richiesta fosse ben formato. Maggiori informazioni sul mio caso e simili riportano lo stesso qui .


0

Tutto quello che ho fatto è stato Clean ( Product > Clean) il mio progetto ed eseguirlo di nuovo


0

Questa potrebbe essere una semplificazione eccessiva, ma stai costruendo per il rilascio o con l'ottimizzazione (che rimuove i simboli da Swift o LLVM) troppo alta? In tal caso, modifica il tuo schema e passa a Debug o modifica le impostazioni di build per l'ottimizzazione rapida o LLVM su Nessuna (0).


0

Nel caso in cui qualcuno si trovi ad affrontare questo problema durante il debug di un pod che utilizza internamente una libreria C, c'è un'altra cosa che devi modificare nelle impostazioni del progetto per farlo funzionare in aggiunta a tutto il resto elencato nel thread.

Vai alle impostazioni del progetto Pods -> Il tuo target C-using -> Impostazioni build -> Apple Clang - Flag del compilatore personalizzato -> Altre flag C e rimuovi la -O3bandiera che è arrivata lì in qualche modo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.