2012-10-23 22 views
23

qui sono le mie due righe di codice:lldb errore: variabile non disponibile

NSString *frontFilePath = [[NSBundle mainBundle] pathForResource:[self.bookendFileNames objectAtIndex:self.randomIndex] ofType:@"caf"]; 
NSLog(@"frontFilePath = %@", frontFilePath); 

ho messo un punto di interruzione sulla seconda linea e quando c'è, provo a stamparlo:

(lldb) po frontFilePath 

ma ottengo il seguente errore:

error: variable not available 

sono confuso perché se faccio un passo sopra la dichiarazione NSLog, la variabile effettivamente stampare su consolle e.

Per quello che vale, sto cercando di eseguire il debug della prima riga dal a volte restituisce NULL, quindi non posso, a partire da ora, capire perché.

+14

Penso che questo sia solo una parte del continuo impegno di Apple per rendere Xcode sempre meno utile e utilizzabile. – Suboptimus

risposta

40

Questo è un artefatto di debug del codice ottimizzato. Quando l'ottimizzazione del compilatore è abilitata nelle impostazioni di costruzione, sposta le variabili tra la memoria e i registri mentre decide che è il migliore. Nel punto in cui stai esaminando la variabile in lldb, potrebbe non esistere nei registri o nella memoria, anche se sembra che debba ancora essere disponibile per la visualizzazione.

È possibile che si tratti di una limitazione delle informazioni di debug emesse dal compilatore. A volte il compilatore copia una variabile in un registro per il suo utilizzo e elenca solo la posizione del registro nelle informazioni di debug. Successivamente il registro viene riproposto per altri usi; il valore è ancora presente nello stack ma il compilatore non ha detto al debugger che il valore può essere trovato lì.

L'unico modo per sapere veramente se le informazioni di debug sono insufficienti o se il valore effettivamente non esiste in quella particolare istruzione è esaminare il codice assembly a mano. Non appena si attiva l'ottimizzazione con il compilatore, il codice sorgente diventa una visione debole di ciò che viene effettivamente eseguito in un ordine particolare.

Invece di vagare troppo nello stravagante mondo del debug del codice ottimizzato, raccomando vivamente di disattivare l'ottimizzazione (Livello di ottimizzazione nelle Impostazioni di costruzione) per la tua build e debuggarlo in quel modo, se possibile. Se hai bisogno di eseguire il debug della tua app con l'ottimizzazione, assicurati di costruire con l'ultimo compilatore Apple LLVM supportato dal tuo Xcode - c'è sempre lavoro da fare per migliorare il debugging del codice ottimizzato e vuoi approfittare di più fino ad oggi strumenti che puoi

+1

BTW per essere chiari - sono stato distratto dai dettagli nella mia risposta - quello che lldb sta dicendo è che in questo particolare punto di istruzione, non sa come trovare il valore della variabile. La variabile potrebbe non essere disponibile in quel momento, o le informazioni di debug del compilatore potrebbero essere insufficientemente descrittive, ma non c'è nulla che Lldb possa fare a questo punto, dato ciò con cui deve lavorare. –

+1

Per quello che vale, Impostazioni di costruzione> Livello di ottimizzazione è stato impostato su "nessuno" nella categoria "debug". È impostato su "Più veloce, più piccolo" nella categoria "Rilascio". Presumo che io sia in "debug" e non in "release" ma non sono abbastanza sicuro di come dirlo. –

+2

Mi sono imbattuto in questo in modalità di rilascio invece di Debug, grazie per questa risposta, mi ha aiutato a individuarlo più rapidamente e ripristinare :) – Luke

Problemi correlati