2009-03-02 11 views
25

mi sembrano avere un po 'troppo zelante rilasciando succedendo nella mia obj-C app - ricevendo il messaggio di errore"messaggio inviato a deallocato esempio 0x5633b0" Objective-C

"- [myobj rilascio]: messaggio inviato a deallocata istanza 0x5633b0 "

. Conosco la classe dell'istanza dell'oggetto che causa il problema, ma questa classe è usata dappertutto per creare molte istanze.

Il mio pensiero è che potrei mettere un logging nel metodo init della classe per loggare qualunque cosa "0x5633b0" corrisponde alla quale dovrebbe aiutarmi a rintracciare dove viene creata l'istanza.

Che cosa è esattamente il "0x5633b0" e c'è un modo per accedere a tale valore nel codice per registrarlo?

Grazie.

risposta

30

0x5633b0 è probabilmente l'indirizzo dell'oggetto in questione (il valore di self). È possibile utilizzare NSLog o printf con %p per stamparlo.

+1

Ecco, ho avuto bisogno di un modo per ottenere l'indirizzo dell'oggetto in qualche modo. Ho aggiunto: NSLog (@ "INIT% p", self); al mio metodo init e sono stato in grado di dire quale istanza stava causando il problema. Grazie. –

+0

questo è utile grazie. – kukudas

+3

È possibile aggiungere un punto di interruzione a: "- [_ NSZombie methodSignatureForSelector:]" per arrestare il debugger quando viene registrato "messaggio inviato all'istanza deallocata ...". –

-12

Non stai gestendo correttamente la tua memoria - stai chiamando release/autorelease su qualche oggetto più volte di quello che stai chiamando retain. Assicurati di seguire tutte le regole stabilite nello Memory Management Programming Guide for Cocoa.

0x5633b0 è solo l'indirizzo della posizione di memoria in cui è memorizzato l'oggetto. Una cosa che si può provare a fare è quello di aggiungere del codice al metodo init:

- (void) init 
{ 
    if(self == (MyClass*)0x5633b0) 
     NSLog(@"Allocated object at address 0x5633b0"); // put a breakpoint on this line 
    // do rest of init... 
} 

Se avete altre init metodi (ad esempio initWithCoder:, che si chiama per gli oggetti istanziati da un XIB), assicuratevi di mettere questo frammento anche in questi metodi. Metti un punto di interruzione sulla linea NSLog e poi guarda quando viene colpito. Si noti che potrebbe essere colpito più volte, se un oggetto viene assegnato a quell'indirizzo, deallocato, e quindi un altro oggetto viene riallocato allo stesso indirizzo. L'ultimo colpo prima del crash è quello che vuoi.

+13

Come conosci in anticipo l'indirizzo del simbolo? Non è diverso ogni volta che esegui il codice. Almeno questo l'ho notato. L'uso di qualcosa come "info symbol 0xabcdfg" nella console del debugger mi ha dato risultati migliori del tuo probosal. – leviathan

11

Nel debugger, digitare info symbol 0x5633b0 e si otterrà qualche indicazione su quale oggetto è. Un'altra cosa che potrebbe essere utile è backtrace che ti darà una traccia dello stack. Tutto sommato, this blog entry ha alcuni suggerimenti grandi.

+5

Non funziona se è stato deallocato :( – JeroenEijkhof

+3

Con 'lldb' è' ricerca immagine --indirizzo 0x1ec4' o la versione corta 'im loo -a 0x1ec4'. – amb

42

Quello che ha funzionato meglio per me, quando mi sono imbattuto in problemi simili di recente è stata la seguente:

  1. Sotto sotto Progetto-> Modifica attivi Executable - Scheda> Argomenti -> Ambiente sezione variabili ho aggiunto e impostare a YES le seguenti variabili: NSAutoreleaseFreedObjectCheckEnabled, NSZombieEnabled e NSDebugEnabled.

  2. Nel menu Esegui, ho selezionato Abilita Guard Malloc.

Con queste impostazioni il debugger fornisce ulteriori suggerimenti su cosa c'è che non va nel mio codice.

(ho trovato questi suggerimenti here)

Buona fortuna, Ori

+5

Abilita Guard Malloc non funziona durante il debug su un dispositivo , almeno non posso e questo post lo conferma: https://discussions.apple.com/thread/1572993?start=0&tstart=0 – JeroenEijkhof

+0

@JeroenEijkhof ha ragione, i malloc di guardia non funzionano nel dispositivo e possono essere abilitato nella scheda 'diagnostica', non è necessario impostare in env var. Ma NSAutoreleaseFreedObjectCheckEnabled potrebbe essere necessario impostare come env var. – karim

0

è anche possibile aggiungere questi per le variabili di ambiente:
MallocStackLoggingNoCompact 1

e scrivere nella console gdb:
info malloc-history <paste-address-here>

Riferimento: here

13

0x5633b0 è probabilmente l'indirizzo dell'oggetto deallocato (il valore di myobj). È possibile utilizzare NSLog o printf con %p per stamparlo.

È inoltre possibile utilizzare il profiler strumenti per trovare l'oggetto deallocato.

1. Avviare il profiler:

enter image description here

2. Selezionare "Zombies" e avviare il profiler.

enter image description here

3. Fare clic con il simulatore fino a colpire il vostro "caso l'errore deallocato"

enter image description here

+0

Perché l'inizio della risposta copia completamente @ Risposta di LoganCapaldo? – FreeNickname

+0

Devo averlo copiato e non ho mai guardato indietro, grazie per averlo indicato. Ho aggiunto qualche spiegazione in più. – leviathan

+1

Tre anni dopo: grazie! –

Problemi correlati