Xcode Debugger: visualizza il valore della variabile


107

Il mio codice in un UITableViewController:

delegate.myData = [myData objectAtIndex:indexPath.row];

Come posso vedere i valori di delegate.myDatao indexPath.rownel debugger? delegate.myDatadovrebbe essere un array e indexPath.rowun file int. Posso solo vedere gli indirizzi di memoria degli oggetti delegatee indexPathma dove sono myDatae row?

testo alternativo

Risposte:


142

Controlla questo Come visualizzare il contenuto della variabile NSDictionary nel debugger Xcode?

Uso anche

po variableName
print variableName

in Console.

Nel tuo caso è possibile eseguire

print [myData objectAtIndex:indexPath.row]  

o

po [myData objectAtIndex:indexPath.row]

Grazie! Provo molto: "print [myData objectAtIndex: indexPath.row]", "po [myData objectAtIndex: indexPath.row]", "print indexPath.row", "po indexPath.row", ... Ma ogni volta ha ricevuto il messaggio "Nessun membro con nome riga." Funziona: "print indexPath" e "po indexPath". Quindi ho provato a usare "[]" invece di ".": "Po [indexPath row]" -> "Impossibile stampare la descrizione di un oggetto NIL." "po [indexPath getRow]" -> "La destinazione non risponde a questo selettore di messaggi." :-(
Manni

4
prova print (int) [indexPath row]
Andriy

po [myData objectAtIndex: (int) [indexPath row]]
Andriy

@VanDuTran Sono abbastanza sicuro che l'equivalente di po objin swift sia po print(obj).
Chris

Questo era perfetto anche per trovare i valori delle proprietà calcolate. Grazie!
Paula Hasstenteufel

25

Sono d'accordo con altri poster sul fatto che Xcode come ambiente di sviluppo dovrebbe includere un modo semplice per eseguire il debug delle variabili. Bene, buone notizie, ce n'è una!

Dopo aver cercato e non trovato una semplice risposta / tutorial su come eseguire il debug delle variabili in Xcode, sono andato ad esplorare con Xcode stesso e ho trovato questa scoperta (almeno per me) molto utile.

Come eseguire facilmente il debug delle variabili in Xcode 4.6.3

Nella schermata principale di Xcode assicurati di vedere l'area di debug inferiore facendo clic sul pulsante nell'angolo in alto a destra mostrato nello screenshot.

Pulsante Area di debug

Area di debug in Xcode 4.6.3

Ora imposta un punto di interruzione, la riga nel codice in cui desideri che il programma metta in pausa, facendo clic sul bordo dell'area del codice.

Punto di rottura

Ora nell'Area di debug cerca questi pulsanti e fai clic su quello al centro. Noterai che la tua area è ora divisa in due.

Area di debug divisa

Dovrebbe assomigliare a questo

Ora esegui la tua applicazione.

Quando il primo Breakpoint viene raggiunto durante l'esecuzione del tuo programma vedrai sul lato sinistro tutte le tue variabili disponibili in quel breakpoint.

Campo di ricerca

È possibile espandere le frecce di sinistra sulla variabile per maggiori dettagli. Inoltre, utilizza il campo di ricerca per isolare la variabile che desideri e vederla cambiare in tempo reale mentre "entri" nell'ambito del punto di interruzione.

Entra

Sul lato destro della tua area di debug puoi inviare per stampare le variabili come desideri utilizzando il tasto destro del mouse facendo clic sulla variabile desiderata.

Menu contestuale

Come puoi vedere, quel menu contestuale è pieno di opzioni di debug molto interessanti. Come Watch che è già stato suggerito con i comandi digitati o anche Modifica valore ... che cambia il valore di runtime della tua variabile!


21

Inoltre puoi:

  1. Imposta un punto di interruzione per sospendere l'esecuzione.
  2. L'oggetto deve essere all'interno dell'ambito di esecuzione
  3. Spostare il puntatore del mouse sull'oggetto o sulla variabile
  4. Apparirà un suggerimento giallo
  5. Muovi il mouse sulla descrizione comando
  6. Fare clic sulle due piccole frecce che puntano su e giù
  7. Apparirà un menu contestuale
  8. Seleziona "Stampa descrizione", eseguirà una [descrizione oggetto]
  9. La descrizione apparirà nell'output della console

IMHO un po 'nascosto e ingombrante ...


Nel mio xcode "Print Description" non funziona, quindi come posso abilitarlo?
Kirtikumar A.

@kirtiavaiya l'applicazione deve essere in pausa e la tua variabile deve essere all'interno dell'ambito corrente per essere stampata. Inoltre non puoi stampare direttamente "self.variable", ma puoi usare la soluzione Andriy per stampare _ <nome della variabile>. Ad esempio: per self.btnHello scrivi nella console "po _btnHello" (funziona solo se non hai cambiato il nome del metodo getter)
LightMan

@LightMan sì, è come hai detto, ma anche non funziona
Kirtikumar A.

10

La tua confusione deriva dal fatto che le proprietà dichiarate non sono (necessariamente denominate come) (istanza) variabili.

L'espressione

indexPath.row

è equivalente a

[indexPath row]

e l'assegnazione

delegate.myData = [myData objectAtIndex:indexPath.row];

è equivalente a

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

assumendo una denominazione standard per le proprietà sintetizzate.

Inoltre, delegateè probabilmente dichiarato come di tipo id<SomeProtocol>, cioè, il compilatore non è stato in grado di fornire informazioni sul tipo effettivo delegatea quel punto, e il debugger si basa sulle informazioni fornite in fase di compilazione. Poiché idè un tipo generico, non ci sono informazioni in fase di compilazione sulle variabili di istanza in delegate.

Questi sono i motivi per cui non vedi myDatao rowcome variabili.

Se vuoi controllare il risultato dell'invio di -rowo -myData, puoi usare i comandi po po:

p (NSInteger)[indexPath row]
po [delegate myData]

oppure usa la finestra delle espressioni (ad esempio, se sai che il tuo delegateè di tipo effettivo MyClass *, puoi aggiungere un'espressione (MyClass *)delegate, o fare clic con il tasto destro delegate, scegliere View Value as…e digitare il tipo effettivo di delegate(es MyClass *.).

Detto questo, sono d'accordo che il debugger potrebbe essere più utile:

  • Potrebbe esserci un'opzione per indicare alla finestra del debugger di utilizzare le informazioni sul tipo di runtime invece delle informazioni in fase di compilazione. Rallenterebbe il debugger, certo, ma fornirebbe informazioni utili;

  • Le proprietà dichiarate potrebbero essere visualizzate in un gruppo chiamato proprietà e consentire l'ispezione (facoltativa) direttamente nella finestra del debugger. Ciò rallenterebbe anche il debugger a causa della necessità di inviare un messaggio / eseguire un metodo per ottenere informazioni, ma fornirebbe anche informazioni utili.


Grazie per la tua spiegazione! Questo mi ha aiutato molto! :-)
Manni

7

È possibile stampare i valori nella finestra della console in fase di esecuzione. Di seguito sono riportati i passaggi:

  1. Posiziona un punto di interruzione per il quale desideri ottenere valori
  2. Ora esegui il debug passo passo.
  3. Posizionare un cursore sulla variabile / delegato il cui valore deve essere verificato in fase di esecuzione.
  4. Ora questo mostrerà la descrizione della variabile / delegato
  5. Facendo clic su "i" verrà visualizzata una descrizione dettagliata
  6. Questo stamperà anche i dettagli sulla finestra della console.

Screenshot per la stampa dei dettagli sulla finestra della console


1
Funziona su swift, sono nuovo a swift non posso vedere i valori dell'oggetto come usiamo per vedere in obj c.
umairhhhs

1
@umairhhhs Questo post è solo per Objective-C.
Jayprakash Dubey,

1
Mi chiedo perché questo non sia nell'editor rapido perché è stata molto utile e ha fatto risparmiare tempo.
umairhhhs

1

Questo diventa un po 'complicato. Questi oggetti sono classi o strutture personalizzate e guardare al loro interno non è così facile su Xcode come in altri ambienti di sviluppo.

Se fossi in te, vorrei NSLog i valori che vuoi vedere, con una descrizione.

vale a dire:

NSLog(@"Description of object & time: %i", indexPath.row);

11
Sì, NSLog è una possibilità ma non una comoda alternativa al debug. Sono molto sorpreso che non sia possibile visualizzare i valori desiderati. Ciò appartiene alla funzionalità di base di un ambiente di sviluppo.
Manni

2
La cosa più esasperante di XCode. Patetico.
ryan0

1

Prova Esegui-> Mostra-> Espressioni

Inserisci il nome dell'array o quello che stai cercando.


Grazie! Ho inserito "indexPath.row" e "delegate.myData" nella finestra delle espressioni ma ogni volta appare "out of scope" nella colonna "Summary" :-(
Manni

np, ho avuto lo stesso problema finché non l'ho trovato;)
tbone

1
imposta un punto di interruzione subito dopo aver impostato l'array o qualsiasi altra cosa e dovresti trovare il valore in Expressions. Buona fortuna
tbone
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.