Il debugger Xcode non stampa oggetti e mostra zero, quando non lo sono


165

Xcode mostra un errore quando si tenta di stampare un oggetto con po <objectName>, ma solo per un progetto.

Immagine dello schermo

errore: impossibile materializzare struct: la dimensione della variabile <nomevar> non è d'accordo con la dimensione di ValueObject Errata in Execute, impossibile PrepareToExecuteJITExpression

Il debugger Xcode mostra anche TUTTI gli oggetti come nil( selfesclusi), quando non lo sono ( NSLogmostra l'output corretto, come mostrato nell'immagine). Non so cosa c'è che non va nel progetto. Ogni altro progetto funziona bene.

Qualche idea di cosa potrebbe essere? (La pulizia del progetto non ha avuto alcun effetto.)


A me sembra una specie di problema con il puntatore, ma sono sicuro che sarà sincero. Cosa stai cercando di fare / realizzare?
user2967030

3
L'errore si verifica su ogni oggetto di quel progetto. Anche NSStrings ha creato una linea sopra il punto di interruzione!
Binarian

1
Come detto nella domanda, la pulizia non cambia nulla; (, ma grazie per aver provato. Aggiunto il messaggio di errore.
Binarian

3
Sei sicuro di costruire senza ottimizzazioni? (-O0)
iccir il

1
Le ottimizzazioni possono essere impostate non solo nelle impostazioni del progetto ma anche nelle destinazioni. Sono rimasto bloccato :(
basilico

Risposte:


269

Sei sicuro di non essere in "Modalità di rilascio"?

Se vuoi vedere i valori delle variabili devi essere in "Modalità debug" (fai clic sul nome del tuo progetto nell'angolo in alto a sinistra vicino ai pulsanti di avvio / arresto, quindi su "Modifica schema ...", quindi su "Esegui", quindi " Info ", quindi" Build Configuration ". Qui imposta" Debug ". Se era su" Release ", questo è il problema che hai visto tutti nulli).


3
Ho solo una configurazione, come cambiare la configurazione in modo che sia come una debug configuration?
Binarian

2
Ah ok, ho creato un progetto vuoto e ora posso vedere tutte le differenze nella Build Settingsproprietà di distribuzione Strip debug symbols during copyimpostata su SÌ.
Binarian

16
@ Alex1987 Ho impostato Strip debug symbols during copyto NOe Optimization Levelto None -O0nel progettoBuild Settings
Binarian

32
Sfortunatamente, in alcune situazioni lldb lo sta facendo in modalità debug, con ottimizzazioni disattivate e simboli di debug presenti. È ora di visitare bug report.apple.com
ctpenrose,

4
Aveva lo stesso problema: il livello di ottimizzazione era "Nessuno". Il problema era che Link-Time Optimization (LTO) era impostato su "Sì" anche per la modalità di debug.
pi3,

38

Ho impostato "Livello di ottimizzazione" per la configurazione di debug su "Nessuno" e il problema è stato risolto.


2
Divertente, non ha funzionato. Ho fatto il contrario. Sono passato a Fastest, Smallest[-Os]e ha funzionato.
Nate Hat,

Molti suggerimenti diversi, ma questo (impostando l'ottimizzazione del debug su Nessuno) l'ha risolto per me.
Dejal,

29

Assicurati che Sanitizer indirizzo sia disattivato nelle impostazioni del tuo schema. Address Sanitizer non funziona bene con il debugger.

  1. Vai a Modifica schema (Prodotto >> Schema >> Modifica schema), scegli Esegui e vai alla scheda Diagnostica.
  2. Assicurati che "Abilita disinfettante per indirizzi" sia disattivato.

inserisci qui la descrizione dell'immagine


4
Questa è stata la soluzione per me. Apparentemente ci sono molte ragioni per cui questo può accadere.
Manroe,

16

Sembra che ognuno abbia la propria soluzione.

Per me, io uso Objective-Ce Swiftallo stesso tempo.

Prima di tutto, vai a TARGETS -> Build Settingse cerca incode generation

Troverai Apple LLVM 6.0 e Swift Compiler

Cambia Optimization Leveltutto in None, quindi Debug, potresti non trovare il valorenil

Sorprendentemente, una volta che riesci a vedere il valore, risolvi questo problema in modo permanente, quindi puoi cambiarlo Optimization Levelcome prima.


11

Ci sono altri modi in cui ciò può accadere. Per me è stato perché il valore "Altre bandiere C" era impostato su "-O2", anche per la build di debug. La disattivazione per la build di debug ha risolto il problema.


9

Output di debug filtrato

Per me, Xcode stava filtrando l'output del debugger. Assicurarsi che l'impostazione dell'output sia Output debugger o Tutti output


6

Ho appena riscontrato questo problema e ho scoperto che era perché Deployment Postprocessing = YESnelle impostazioni di costruzione.

Modificandolo per NOrisolverlo, come mostrato nello screenshot qui sotto:

inserisci qui la descrizione dell'immagine

Versione Xcode: 6.0.1 (6A317) su OSX 10.9.5


5

Ho appena riscontrato un problema simile: ad un certo punto il debugger Xcode ha stampato alcuni tipi di oggetti, in particolare NSStrings come (null) sebbene siano stati inizializzati con un valore. Stampato via

NSLog(@"String value: %@", myString);

è stato mostrato il valore corretto per l'oggetto.

Confondere! Risolvere il problema è stato piuttosto semplice: ho appena chiuso Xcode e riavviato il mio computer. Dopo aver riavviato Xcode tutto funziona di nuovo bene :).


5

Assicurati Link-Time Optimization = Nodella modalità di debug in Impostazioni build.


Ho riscontrato questo problema in Xcode 8 solo nelle mie impostazioni di build del framework dinamico! Thx
vmeyer,

3
  1. Elimina i dati derivati
  2. Abbastanza Xcode / Restart
  3. Progetto pulito

Questo è tutto per me.


2

Le soluzioni qui risolveranno anche il bug che vedi error: <EXPR>:1:1: error: use of unresolved identifierogni volta che provipo una variabile.

Per me la soluzione era quella di andare a Build Settingscercare Optimization Levele assicurarsi che ogni Debugimpostazione fosse impostata su None.


Questo in realtà l'ha risolto per me. Hai idea di quale sia lo svantaggio di disabilitare l'impostazione?
Jasper,

1

Vai su "Altre bandiere C" nell'impostazione di creazione e imposta il valore di debug da -o2 a -O0


0

Mi sono imbattuto anche in questo e quando ho scoperto che ero in modalità di rilascio, passo al debug ... nessuna correzione. Si scopre che ho dovuto fare prima una pulizia (cmd + maiusc + k).

Quindi penso che ciò che accade sia che dopo che è stato sviluppato in modalità di rilascio non tutto è ricompilato nello sviluppo e quindi lldb non riesce a leggere correttamente i simboli. Dopo aver pulito e ricompilato in sviluppo ha funzionato per me.


-3

La realtà è che il sistema dovrebbe funzionare immediatamente e non a causa di collegamenti a una quantità multipla di impostazioni diverse, al punto che le cose potrebbero funzionare per te o no.

Perché il sistema non consente sempre di eseguire il debug quando è in modalità debug è un mistero a cui solo Apple può rispondere (se gliene importava, che latelly dubito che facciano).

Dopotutto, la differenza tra debug / non-debug sarebbe tabelle extra con metadati che riempirebbero solo lo spazio di memoria / disco.

Se stai compilando direttamente contro il simulatore o un dispositivo, non ti occuperai di quei megabyte aggiuntivi.

Quindi abbiamo bisogno di eseguire loop extra per fare una cosa molto semplice e semplice che tutti gli idi che conosco dal secolo scorso fanno bene.

E per aggiungere, per me ciò che ha funzionato stava cambiando "Debug" l'ottimizzazione del collegamento temporale da "Monolitico" a "No" (xcode 8).


Xcode = Nessun gestore di pacchetti
pronto all'uso
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.