2011-11-23 22 views
9

Sto ottenendo il seguente indice di errore di limiti:NSRangeException: Call Stack che non si visualizzano Linea Numero

*** Terminating app due to uncaught exception 'NSRangeException', reason: 
'*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array' 
*** First throw call stack: 
(0x2263052 0x24c7d0a 0x224fdb8 0x2f4a7 0x2264ec9 0x81e299 0x81e306 0x75aa30 
0x75ac56 0x741384 0x734aa9 0x39a9fa9 0x22371c5 0x219c022 0x219a90a 0x2199db4 
0x2199ccb 0x39a8879 0x39a893e 0x732a9b 0x1e5b 0x1dc5 0x1) 

So esattamente cosa significa l'errore, ma trovo questi errori molto difficili da risolvere perché per qualche motivo lo stack delle chiamate non indica la riga di codice in cui è stato chiamato l'array. Ecco lo stack di chiamate da thread 1:

#0 0x9706d9c6 in __pthread_kill() 
#1 0x93e2cf78 in pthread_kill() 
#2 0x93e1dbdd in abort() 
#3 0x02859e78 in dyld_stub__Unwind_DeleteException() 
#4 0x0285789e in default_terminate()() 
#5 0x024c7f4b in _objc_terminate() 
#6 0x028578de in safe_handler_caller(void (*)())() 
#7 0x02857946 in __cxa_bad_typeid() 
#8 0x02858b3e in __cxa_current_exception_type() 
#9 0x024c7e49 in objc_exception_rethrow() 
#10 0x02199e10 in CFRunLoopRunSpecific() 
#11 0x02199ccb in CFRunLoopRunInMode() 
#12 0x039a8879 in GSEventRunModal() 
#13 0x039a893e in GSEventRun() 
#14 0x00732a9b in UIApplicationMain() 
#15 0x00001e5b in main 

Come si può vedere questo stack di chiamate non è molto utile perché non mostra alcun metodo dal mio codice. Inoltre, lo stack di chiamate mostrato nell'errore ha 22 indirizzi di memoria, mentre lo stack dal thread 1 ne ha solo 15 e gli indirizzi non corrispondono affatto. Nessun altro thread sembra contenere informazioni utili.

Come è possibile visualizzare il thread del "Primo stack di chiamate" dall'errore (quello con 22 indirizzi), quindi posso trovare la riga che causa questo errore? Forse ho qualcosa impostato in modo errato nelle mie impostazioni di compilazione che sta causando il non essere recuperabile lo stack in questione?

Se qualcuno potesse indicarmi la giusta direzione, sarei molto grato. Cercare di localizzare manualmente la linea incriminata è abbastanza noioso.

Grazie!

risposta

17

Accendere il debugger e impostare un punto di interruzione ogni volta che viene generata un'eccezione, in questo modo si sa esattamente quale riga di codice è essere un coglione.

objc_exception_throw

alternativa, [NSException sollevare];

Dai un'occhiata alla seguente domanda: Add breakpoint to objc-exception-throw

+9

Grazie Antwan, questo funziona perfettamente! Per chiunque cercando di fare questo in Xcode 4 qui sono i passi che ho usato: 1. Nell'angolo in basso a sinistra del navigatore breakpoint (2 ° scheda da destra) fare clic sul pulsante ("+") Aggiungi. 2. Scegliere Aggiungi punto di interruzione eccezione. 3.Per "Eccezione" selezionare "C++" 4. Accanto a "named" digitare "objc_exception_rethrow" 5. Fare clic su Fine. – llama591

2

Hai attivato punti di interruzione globali nel progetto? se non aggiungi objc_exception_throw alla sezione punti di interruzione nel navigatore di progetto, quindi riesegui l'app, dovresti ottenere lo stack. In aggiunta, quando si schianta, guardate ed espandete qualsiasi thread aggiuntivo per vedere anche i loro stack. A me è capitato più volte che la pila ero alla ricerca era in un thread in background, anche se l'incidente era stato segnalato dal thread principale. HTH.

0

Supponendo che ciò si sia verificato durante il debugger XCode, è possibile determinare la riga di codice a cui si fa riferimento negli indirizzi di traceback. Nella finestra di debug, immettere la seguente:

elenco di indirizzi * da traceback

Ad esempio, per il primo accesso, è necessario immettere il seguente: lista * 0x2263052

fare questo per ogni indirizzo . Uno di questi dovrebbe puntare al codice del programma ed elencare il numero di linea e il codice in errore sopra e sotto la linea in errore.

-Steve

Problemi correlati