2013-11-02 16 views
23

Ho ricevuto un erroreCome eseguire il debug EXC_BAD_ACCESS bug

codice EXC_BAD_ACCESS = 2 at0xb0987654

mi chiedo come stampare il valore a 0xb0987654?

+0

suppongo che non si vuole stampare il valore a quell'indirizzo da quel molto indirizzo è il vostro problema, in primo luogo. Quello che * ti ha fatto * è la domanda da porre. – Jay

risposta

30

Per eseguire il debug di un EXC_BAD_ACCESS, in genere è possibile individuare il punto in cui il puntatore penzolante abilita gli oggetti zombi.

Xcode

Scegli schema di modifica, scheda poi Diagnostica nella sezione Esegui, quindi fare clic su l'opzione 'Zombie Objects.

AppCode

Scegliere Modifica di destinazione e aggiungere il seguente variabile d'ambiente:

NSZombieEnabled=YES 

Un'altra causa di EXC_BAD_ACCESS può essere ricorsione infinita, che può essere trovato con l'aggiunta di un po 'di registrazione.

Aggiornamento per C++:

per eseguire il debug penzoloni puntatori in C++ con il compilatore Clang provare a utilizzare Address Sanitizer (ASAN) da Google.

+2

Ho provato, inutile. Dal momento che è il codice C++ a causare il problema. –

+0

@AdamLee Che ne dici di questo allora? http://stackoverflow.com/questions/3199067/c-catching-dangling-reference –

+0

@AdamLee, Oops ha l'aspetto di MudFlap è solo gcc, aggiornato per Clang/llvm –

2

Sembra che tu stia cercando di scrivere su una tabella codici o qualcosa del genere? EXC_BAD_ACCESS è descritto in /usr/include/mach/exception_types.h:

#define EXC_BAD_ACCESS   1  /* Could not access memory */ 
      /* Code contains kern_return_t describing error. */ 
      /* Subcode contains bad memory address. */ 

E da kern_return.h:

#define KERN_PROTECTION_FAILURE   2 
      /* Specified memory is valid, but does not permit the 
      * required forms of access. 
      */ 

potete vedere dove tale indirizzo è nel tuo binario facendo:

(lldb) image lookup -va 0xb0987654 

Ma quello che è davvero necessario capire è chi sta cercando di scrivere lì. Se il problema è semplice, questo potrebbe dirti cosa c'è che non va, ma come suggerisce Jasper, questo è probabilmente un problema da utilizzare dopo l'uso o altro, e il cattivo attore è da tempo scomparso nel momento in cui ti blocchi. guardmalloc a volte può rilevare questo tipo di errore (è possibile abilitarlo in Xcode nello schema Esegui.)

+7

' image lookup -va 0x1586470c4' in lldb non mi dà alcun output, nemmeno un messaggio di errore. –

+0

Attualmente "ricerca immagine -a" stampa solo ciò che può trovare in un dato indirizzo, anche nel caso di "nessun simbolo a questo indirizzo" quando non è niente ... LLDB dovrebbe davvero stampare qualche errore quando non può trova tutti i simboli associati a un dato indirizzo. Si prega di presentare un bug su questo sia con il reporter di bug di Apple o il bugzilla lldb.llvm.org. Grazie. –

0

Identificare cosa hai causato l'arresto. Si è arrestato in modo anomalo mentre la vista di un determinato controller di visualizzazione è stata caricata o in un metodo delegato o in una determinata azione. Questo spesso aiuterà a trovare l'oggetto che sta rilevando l'errore.

  • La maggior parte delle volte "NSZombies" può aiutare a identificare l'oggetto morto. È possibile abilitare NSZombies modificando lo schema Prodotto -> Modifica schema -> Diagnostica.
  • Se non si trova ancora la causa principale, andare sempre indietro dal controller di visualizzazione figlio a quello di visualizzazione padre per vedere quale oggetto deve essere conservato o quale messaggio deve essere trasmesso correttamente.
  • Esaminare l'analizzatore statico e gli strumenti per il debug avanzato.

Spero che questo ti possa aiutare.

saluti, Gison