2009-06-10 16 views
30

Ho una semplice domanda sul debug su Xcode e GDB.Come guardo un oggetto nel debugger di Xcode?

spesso incorrere in un errore:

unrecognized selector sent to instance 0x1081ad0 

che rende il caricamento del programma in GDB. C'è un modo semplice per esaminare quale istanza si trova in quella memoria da GDB?

risposta

42

po 0x1081ad0

PO = Stampa oggetto. È anche possibile chiamare i metodi, come

po [myArray objectAtIndex:0]

Nota che funziona solo su oggetti, in modo da

po 1

andrà in crash il programma.

+7

"po 1" non manderà in crash il programma - gdb è più intelligente di così. Sarà solo stampare un messaggio di errore. –

+10

Nota anche, per stampare cose non-object (come un int), solo noi p, come 'p 1' – RickDT

+1

dove puoi scriverlo? – chwi

6

Ci sono un paio di cose che puoi fare.

  1. È possibile inserire un punto di rottura che attiverà ogni volta che si dispone di un'eccezione, in modo sostanzialmente creare un punto di rottura per questo (andare a punti di interruzione e di crearne uno nuovo): - [NSException rilancio]
  2. in alternativa, si può effettivamente vedere ciò che l'oggetto in quella posizione mem è:

    info simbolo 0x1081ad0 o

    Info Line * 0x1081ad0

Ulteriori informazioni sono disponibili su cocoadev wiki entry for exceptionhandling e debugging tips for objective C at cocoawithlove.

9

Steven è corretto - il comando gdb po è una scorciatoia per print-object, che in realtà chiama -debugDescription (non -description, come ci si potrebbe aspettare) sull'oggetto fornito come argomento. In molti casi vedrai lo stesso risultato da entrambi i metodi, dal momento che uno chiama l'altro a meno che non venga sovrascritto. (Vedi relativo Nota:. Richiamo this Apple technote per i dettagli noti che nel loro codice di esempio, po $r3 stampe il contenuto di un registro PowerPC, ma è possibile utilizzare qualsiasi oggetto puntatore/riferimento, tra cui registri Intel, etc.)

Inoltre, tenere presente che print-object funziona solo su oggetti validi che non sono stati deallocati. Non aiuterà affatto se stai inviando un messaggio a un puntatore borked. Dato l'errore che hai citato, sembrerebbe che sia un'istanza di oggetto valida, semplicemente non implementa il metodo che stai cercando di invocare.

È anche possibile in remoto che l'oggetto sia già stato distrutto. This answer dovrebbe aiutare in questo caso.


Edit:

Ci sono altri modi per "esaminare" gli oggetti del debugger.Ho chiesto allo this SO question di formattare i dati Xcode, che è un modo per determinare come appare una classe personalizzata nella colonna Riepilogo del debugger. La documentazione collegata a quella domanda spiega come funziona. Ho trovato l'approccio di sintesi per aiutare molto nel vedere lo stato di un oggetto.

0

L'istanza non è valida. Hai rilasciato l'oggetto da qualche altra parte, ma non hai cancellato il puntatore ... abilita il rilevamento degli zombi.

Problemi correlati