2014-09-05 22 views
25

MyApp funziona bene nel 98% dei casi, ma a volte mostra un arresto anomalo. Ed è così casuale.crash ios EXC_BAD_ACCESS KERN_INVALID_ADDRESS

Il rapporto di arresto anomalo mostra quanto segue.

Thread : Crashed: com.apple.main-thread 
0 libobjc.A.dylib    0x3b1ae626 objc_msgSend + 5 
1 Foundation      0x310e2381 _netServiceMonitorCallBack + 104 
2 CFNetwork      0x302ea3b5 _QueryRecordReply(_DNSServiceRef_t*, unsigned int, unsigned int, int, char const*, unsigned short, unsigned short, unsigned short, void const*, unsigned int, void*) + 324 
3 libsystem_dnssd.dylib   0x3b7289d9 handle_query_response + 168 
4 libsystem_dnssd.dylib   0x3b72773f DNSServiceProcessResult + 582 
5 CFNetwork      0x302ea3e5 _SocketCallBack_Mon(__CFSocket*, unsigned long, __CFData const*, void const*, void*) + 20 
6 CoreFoundation     0x30691189 __CFSocketPerformV0 + 580 
7 CoreFoundation     0x3068efaf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14 
8 CoreFoundation     0x3068e477 __CFRunLoopDoSources0 + 206 
9 CoreFoundation     0x3068cc67 __CFRunLoopRun + 630 
10 CoreFoundation     0x305f7729 CFRunLoopRunSpecific + 524 
11 CoreFoundation     0x305f750b CFRunLoopRunInMode + 106 
12 GraphicsServices    0x355336d3 GSEventRunModal + 138 
13 UIKit       0x32f58871 UIApplicationMain + 1136 
14 MyApp       0x0013f813 main (main.m:16) 

Tutti questi sembrano metodi interni. Ho riscontrato questi arresti anomali su iPad 4 con iOS 7.1.2. Come posso inchiodarlo. Tutto aiuta apprezzato.

+1

Mostra la parte superiore del report incidente per favore. Soprattutto il codice di eccezione. È '0xbadfood'? – orkoden

+0

Nessun codice di eccezione è 0xf000000c, 0x0000000f. Entrambi gli arresti hanno lo stesso stack. –

+0

utilizza un ExceptionHandler, controlla la mia risposta qui: http://stackoverflow.com/questions/10501358/objective-c-getting-line-number-or-full-stack-trace-from-debugger-error/25551171#25551171 –

risposta

20

Questo arresto anomalo si verifica a causa di perdita di memoria. Quando qualsiasi variabile o oggetto sta tentando di accedere alla memoria limitata si verifica questo arresto anomalo.

+5

Può essere dovuto all'invio di un messaggio a un oggetto già rilasciato. Ma guardando la traccia dello stack non capisco dove potrebbe essere andato storto e il progetto completamente in ARC. –

+2

Utilizzare qualsiasi blocco? – stevesliva

+1

@stevesliva perché i blocchi potrebbero essere un problema qui?[Li sto usando e ottengo un errore simile] – ripegooseberry

11

Questa è una vecchia domanda ma l'arresto di KERN_INVALID_ADDRESS EXC_BAD_ACCESS non è dovuto a perdita di memoria, ma a causa del tentativo di accesso a un oggetto deallocato. Poiché la memoria dell'oggetto deallocated è probabilmente ora occupata da un altro oggetto di tipo diverso, l'ultima riga nello stack di crash potrebbe essere fuorviante perché non fa realmente parte del percorso di esecuzione programmato, quindi di solito dobbiamo cercare la traccia un po. Tuttavia, la traccia dello stack pubblicata da @Sj consiste essenzialmente solo di chiamate di sistema, quindi è davvero difficile. Se questo viene generato in una sessione di debug, l'aggiunta di un punto di interruzione "Tutte le eccezioni" potrebbe aiutare a generare una traccia dello stack più informativa.

+0

Grazie per la segnalazione. Sì, non è dovuto a perdite di memoria. stevesliva ha aggiunto un commento che ha aiutato. Era dovuto ai blocchi e all'oggetto che veniva rilasciato prematuramente. Ecco perché anche la traccia dello stack non è chiara. –

-2

incidente EXC_BAD_ACCESS KERN_INVALID_ADDRESS non è dovuto alla perdita di memoria, ma a causa al tentativo di accedere a un oggetto deallocato.

Esempio: se è stato utilizzato __weak typeof(self) weakSelf = self; e l'oggetto è stato rilasciato prima di accedervi all'interno del blocco avrete ottenuto l'incidente. Il motivo: accesso a un indirizzo di memoria errato perché l'oggetto è stato deallocato.

Per evitare che questo uso __strong typeof(self) strongSelf = self; all'interno del blocco. Nil valore sarà gestita adeguatamente senza incidente


Nota: uso questo esempio di codice per il lavoro veloce.

#define weakify(var) __weak typeof(var) AHKWeak_##var = var; 

#define strongify(var) \ 
_Pragma("clang diagnostic push") \ 
_Pragma("clang diagnostic ignored \"-Wshadow\"") \ 
__strong typeof(var) var = AHKWeak_##var; \ 
_Pragma("clang diagnostic pop") 

Esempio di utilizzo:

weakify(self); // Remove retain cycle 
[self someFunctionWithBlock:^{ 
    strongify(self); // Make reference to address valid 

}]; 
+0

Non è corretto; messaggiare un 'nil' weakSelf è come fare un altro' nil' in ObjC, è un no-op e va bene. Hai solo bisogno di 'strongificare' il riferimento debole se hai intenzione di inviarlo più messaggi, per assicurarti che non venga deallocato a metà. – buildsucceeded

+0

Probabilmente non l'ho descritto chiaramente, ma ripeti la mia idea, sono d'accordo con te. – akaDuality

Problemi correlati