2016-11-04 6 views
0

Ich erhalte plötzlich seltsam Malloc Fehler in meinem Code wie:Malloc Fehler in Swift

malloc: *** error for object 0x7fbdc8daa2f8: incorrect checksum for freed object - object was probably modified after being freed. 
*** set a breakpoint in malloc_error_break to debug 

Es scheint, dass sie zufällig sind und erscheinen nur an verschiedenen Orten, wenn ich brechen Punkte gesetzt. Ich bin auf XCode 8.1. Schnelles 3.0. Ist jemand darauf gestoßen?

stelle ich den Haltepunkt, und ich bekomme diese:

libsystem_malloc.dylib`malloc_error_break: 
-> 0x112fa4760 <+0>: pushq %rbp 
    0x112fa4761 <+1>: movq %rsp, %rbp 
    0x112fa4764 <+4>: nop  
    0x112fa4765 <+5>: nopl (%rax) 
    0x112fa4769 <+9>: popq %rbp 
    0x112fa476a <+10>: retq 

Antwort

4

Die häufigste Ursache für diesen Fehler ist Einfädeln Verletzungen. Wenn beispielsweise ein Thread die endgültige Version für ein Objekt ausführt und die Zuweisung aufhebt und ein anderer Thread, der eine unowned (Swift) oder assign (ObjC) Referenz auf das Objekt hat, diese modifiziert, wird dieser Fehler ausgelöst. (Es soll nicht möglich sein, diese Fehler zu erhalten, wenn alle Referenzen sind strong oder weak, da es nicht möglich sein sollte, für das Objekt im ersteren Fall freigegeben werden, und weak Referenzen sind Thread-sicher im letzteren Fall.)

es ist natürlich möglich, dass dies einen Fehler in der neuesten SDK ausgesetzt wird (und so sollten Sie einen Radar öffnen), aber es ist typisch, dass es ein Fehler im Code ist, die verursacht haben im Timing ändert sich zu manifestieren. Wie bereits erwähnt, sollten Sie einen symbolischen Haltepunkt auf malloc_error_break setzen, um herauszufinden, um welches Objekt es sich handelt.

+0

Wie kann ich diesen Breakpoint gesetzt? Setze ich es dort, wo der Marker nach dem Absturz im Code erscheint? – KexAri

+1

Es ist ein symbolischer Haltepunkt. Klicken Sie auf der Registerkarte Haltepunkte auf "+" und wählen Sie "Symbolischer Haltepunkt". Es wird ausgelöst, wenn eine Funktion dieses Namens aufgerufen wird. –

+0

und ich setze das Symbol auf 'malloc_error_break'? – KexAri

0

Es geschieht durch ein Objekt zweimal zu befreien oder einen Zeiger zu befreien, die nie vergeben oder das Schreiben durch einen ungültigen Zeiger wurde, die zuvor auf ein Objekt gerichtet, die bereits freigegeben wurden.

Versuchen Product > Scheme > Edit Scheme und unter Diagnostics Registerkarte ermöglichen, die alle Malloc Einstellungen und Guard Malloc. (Diese Option ist nur in Simulator)