2014-09-05 12 views
25

MyApp funktioniert gut in 98% der Zeit, aber manchmal zeigt es einen Absturz. Und es ist so zufällig.ios Absturz EXC_BAD_ACCESS KERN_INVALID_ADDRESS

Der Absturzbericht zeigt Folgendes.

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) 

Alle diese internen Methoden aussehen. Ich erlebe diese Abstürze auf dem iPad 4 mit iOS 7.1.2. Wie kann ich es finden. Alles hilft geschätzt.

+1

zeigen die Oberseite des Crash-Bericht bitte. Vor allem der Ausnahmecode. Ist es "0xbadfood"? – orkoden

+0

Nein, der Ausnahmecode ist 0xf000000c, 0x0000000f. Beide Abstürze haben den gleichen Stapel. –

+0

Verwenden Sie einen ExceptionHandler, überprüfen Sie meine Antwort hier: http://stackoverflow.com/questions/10501358/objective-c-getting-line-number-or-full-stack-trace-from-debugger-error/25551171#25551171 –

Antwort

20

Dieser Absturz tritt aufgrund von Speicherverlust auf. Wenn eine Variable oder ein Objekt versucht, auf eingeschränkten Speicher zuzugreifen, tritt dieser Absturz auf.

+5

Es kann sein, Nachricht an ein bereits freigegebenes Objekt zu senden. Aber wenn ich auf die Stack-Trace schaue, verstehe ich nicht, wo es schief gelaufen ist und das Projekt komplett in ARC. –

+2

Verwenden Sie irgendwelche Blöcke? – stevesliva

+1

@stevesliva Warum sollten Blöcke hier ein Problem sein?[Ich benutze sie und bekomme einen ähnlichen Fehler] – ripegooseberry

11

Dies ist eine alte Frage, aber die EXC_BAD_ACCESS KERN_INVALID_ADDRESS Absturz ist nicht auf Speicherverlust zurückzuführen, sondern auf den Versuch, auf ein freigegebenes Objekt zuzugreifen. Da der Speicher des freizugebenden Objekts möglicherweise jetzt von einem anderen Objekt eines anderen Typs belegt ist, kann die letzte Zeile im Absturz-Stack falsch führen, da sie nicht wirklich Teil des programmierten Ausführungspfads ist. Daher müssen wir normalerweise die Spur nachschlagen ein bisschen. Der Stack-Trace, der von @Sj gepostet wird, besteht jedoch im Wesentlichen nur aus Systemaufrufen, daher ist es wirklich schwierig. Wenn dies in einer Debugsitzung generiert wird, kann das Hinzufügen eines Breakpoints "Alle Ausnahmen" dazu beitragen, eine informativere Stack-Ablaufverfolgung zu generieren.

+0

Danke für das Aufzeigen. Ja, es ist nicht wegen Speicherverlust. stevesliva hat einen Kommentar hinzugefügt, der geholfen hat. Es lag an Blöcken und das Objekt wurde vorzeitig freigegeben. Aus diesem Grund ist der Stack-Trace auch nicht klar. –

-2

EXC_BAD_ACCESS KERN_INVALID_ADDRESS Absturz ist zu Speicherverlust nicht durch, aber aufgrund der Versuch, ein freigegebenes Objekt zuzugreifen.

Beispiel: wenn Sie __weak typeof(self) weakSelf = self; verwendet und Objekt freigegeben wurde, bevor Sie es in Block Zugriff finden Sie den Absturz bekommen. Der Grund - Zugriff auf falsche Speicheradresse, da das Objekt freigegeben wurde.

Um dies zu verhindern, verwenden Sie __strong typeof(self) strongSelf = self; innerhalb des Blocks. dieses Codebeispiel für die schnelle Arbeit Gebrauch: Nil Wert ordnungsgemäß ohne Absturz


Hinweis behandelt werden.

#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") 

Anwendungsbeispiel:

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

}]; 
+0

Das ist falsch; messaging a 'nil' weakSelf ist genau so, als ob man in ObjC irgendjemanden' nil' verschicken würde, es ist ein No-Op und gut zu machen. Sie müssen nur die schwache Referenz "verstärken", wenn Sie mehrere Nachrichten senden möchten, um sicherzustellen, dass sie nicht teilweise freigegeben wird. – buildsucceeded

+0

Wahrscheinlich hatte ich nicht klar beschrieben, aber Sie wiederholen meine Idee, ich stimme Ihnen zu. – akaDuality

Verwandte Themen