2011-01-28 17 views
45

Sto lavorando su un'app per iPhone. Sono uno sviluppatore Java a tempo pieno e sono abituato ad usare Eclipse dove posso inserire un breakpoint e fermare il processo. Quindi, posso digitare qualsiasi espressione che voglio ed Eclipse la valuterà usando i valori da quel punto nel processo.Xcode che valuta le espressioni durante il debug

C'è un modo per farlo in Xcode? Voglio essere in grado di fermarmi a un breakpoint e quindi inserire del codice per valutarlo. La console gdb mi permetterà di fare po (print-object), ma è davvero limitato. Qualsiasi aiuto?

+0

Che cos'è "po"? La console gdb ti permetterà di valutare un ampio set di funzioni arbitrarie. Cosa in particolare dove stai cercando di fare? –

+3

"po" è oggetto di stampa. È l'estensione di Apple a gcc che comporta l'invio del messaggio * description * a un'istanza ObjC in modo che restituisca la sua descrizione. – diciu

+0

Ah, ecco perché non ne ho sentito parlare. Divertimento. –

risposta

40

mia pratica:

po [NSUserDefaults standardUserDefaults]

display: < NSUserDefaults: 0x6143040>

po [[NSUserDefaults standardUserDefaults] stringForKey:@"Currency"]

visualizza: "CHF"

+3

Questa è l'unica risposta che risponde effettivamente alla domanda. Peter sta suggerendo di usare il comando 'po' al prompt' (lldb) 'che è disponibile nella console di debug quando l'esecuzione è stata messa in pausa dal breakpoint del debugger. Il poster originale sottolinea che usano già "po", ma almeno questo è un tentativo di rispondere alla domanda. –

+1

Almeno questa è una risposta –

3
Non un

Swinger domanda su Xcode, ma il AppCode di JetBrains fa questo nel modo IDE standard che molti di noi conoscono da altre piattaforme.

+0

Questo non risponde alla domanda su Xcode, ma non c'è niente di sbagliato in un lead su un altro IDE. Grazie. –

14

Utilizzare il comando "espressione" nel debugger. Usarlo è relativamente semplice. Basta digitare l'espressione del comando e premere Invio. Ti verrà quindi richiesto di inserire un'espressione. Ecco un esempio

(lldb) expression 
Enter expressions, then terminate with an empty line to evaluate: 
2+2 

(int) $2 = 4 

Ho anche allegato le informazioni di aiuto per il comando di espressione di seguito. Spero che questo ti aiuti.

Valutare un'espressione C/ObjC/C++ nel contesto del programma corrente, utilizzando le variabili e le variabili definite dall'utente attualmente in ambito. Questo comando richiede l'input 'raw' (non è necessario citare materiale).

Sintassi: espressione -

Opzioni di comando Uso: espressione [-f] [-G] [-a] [-d] [-t] [-u] - espressione [-o ] [-a] [-d] [-t] [-u] - espressione

-G <gdb-format> (--gdb-format <gdb-format>) 
     Specify a format using a GDB format specifier string. 

    -a <boolean> (--all-threads <boolean>) 
     Should we run all threads if the execution doesn't complete on one 
     thread. 

    -d <boolean> (--dynamic-value <boolean>) 
     Upcast the value resulting from the expression to its dynamic type 
     if available. 

    -f <format> (--format <format>) 
     Specify a format to be used for display. 

    -o (--object-description) 
     Print the object description of the value resulting from the 
     expression. 

    -t <unsigned-integer> (--timeout <unsigned-integer>) 
     Timeout value for running the expression. 

    -u <boolean> (--unwind-on-error <boolean>) 
     Clean up program state if the expression causes a crash, breakpoint 
     hit or signal. 

Timeout: Se l'espressione può essere valutata in modo statico (senza runnning codice) allora sarà. Altrimenti, per impostazione predefinita l'espressione verrà eseguita sul thread corrente con un breve timeout: attualmente .25 secondi. Se non ritorna in quel momento, la valutazione verrà interrotta e riprende con tutti i thread in esecuzione. È possibile utilizzare l'opzione -a per disabilitare il nuovo tentativo su tutti i thread . È possibile utilizzare l'opzione -t per impostare un timeout più breve.

Variabili definite dall'utente: È possibile definire le proprie variabili per comodità o da utilizzare nelle espressioni successive. Li definisci nello stesso modo in cui definiresti le variabili in C. Se il primo carattere di la variabile definita dall'utente è un $, il valore della variabile sarà disponibile nelle future espressioni , altrimenti sarà disponibile solo nell'espressione corrente .

Esempi:

expr my_struct->a = my_array[3] 
    expr -f bin -- (index * 8) + 5 
    expr unsigned int $foo = 5 
    expr char c[] = "foo"; c[0] 

NOTA IMPORTANTE: Poiché questo comando riceve l'input 'crudo', se si utilizzano opzioni di comando è necessario utilizzare '-' tra la fine delle opzioni di comando e l'inizio dell'input grezzo.

63

In XCode 4.0 questo è nascosto nella GUI. Quando sei a un punto di interruzione, puoi probabilmente vedere la vista Variabili all'interno dell'area di debug; è il riquadro che mostra le variabili locali e così via. Fare clic con il tasto destro del mouse sulla vista Variabili e selezionare "Aggiungi espressione ..."

Mi rendo conto che si tratta di un thread precedente, ma è ancora un successo di Google, quindi ho pensato che valesse la pena di rispondere.

+0

Questa è la risposta che è rilevante ora. Grazie –

+0

Bello! Non posso credere che questa opzione sia nascosta così in profondità –

+2

Questo merita più voti! –

Problemi correlati