2012-12-10 5 views
17

Ich habe gerade eine App im AppStore mit Crittercism Absturzberichterstattung veröffentlicht und ich habe ziemlich viele Absturzberichte erhalten, die sich auf einen SIGSEGV-Fehler beziehen. Crittercism gibt mir einen StackTrace und ein paar nützliche Details über Nutzungsstatistiken usw., aber ich bin immer noch verwirrt von diesen symbolisierten Stack-Traces. Ich habe ein paar Fragen im Allgemeinen über diese Art der Sache -SIGSEGV SEGV_ACCERR Absturzberichte - Was ist zu tun?

  1. Viele der Klassen und Methoden im Stack-Trace sind nicht einmal in meiner Anwendung verwendet (meines Wissens), die mich führt, dass diese zu glauben, Abstürze sind auf private APIs von Apple zurückzuführen. Werfen Sie einen Blick auf den Stack Trace am Ende dieser Frage. Wie kann ich feststellen, was meine App zum Absturz bringt, wenn alle Methoden und Klassen im Absturzbericht nicht direkt in meinem Code implementiert sind?

  2. Was bedeuten die + Schilder mit Zahlen am Ende jeder Zeile im abgestürzten Thread?

  3. meist Q/A auf Stackoverflow, die über SIGSEGV Abstürze fragen sagen, dass sie durch Speicherlecks oder Probleme verursacht werden, jedochwie kann ich wegen eines Speicherproblems zu einem Absturz, wenn ich ARC bin mit in mein iOS Projekt? Soll ARC nicht all diese Dinge für mich verwalten?

  4. Was soll ich tun, wenn ich den Fehler/Absturz nicht replizieren kann?

  5. Gibt es eine Möglichkeit, um wirklich lesen ein Stacktrace? Gibt es irgendetwas im Allgemeinen, das hilfreich wäre, um zu verstehen, was passiert? Hier

ist die Stacktrace aus dem Hauptthread Fehlerbericht von Crittercism, dass diese Frage betrifft:

Thread: Unknown Name (Crashed) 
0  UIKit         0x37307a22 -[UIView(CALayerDelegate) actionForLayer:forKey:] + 138 
1  QuartzCore       0x38fdfff7 -[CALayer actionForKey:] + 75 
2  QuartzCore       0x38fdffa7 _ZL12actionForKeyP7CALayerPN2CA11TransactionEP8NSString + 59 
3  QuartzCore       0x38fdfe93 _ZN2CA5Layer12begin_changeEPNS_11TransactionEjRP11objc_object + 131 
4  QuartzCore       0x38fdab87 _ZN2CA5Layer6setterEj12_CAValueTypePKv + 183 
5  QuartzCore       0x39007057 -[CALayer setBackgroundColor:] + 35 
6  UIKit         0x3731ef51 -[UIView(Internal) _setBackgroundCGColor:withSystemColorName:] + 1021 
7  APP NAME        0x000a301d 0x00086000 + 118813 
8  libdispatch.dylib      0x3962511f _dispatch_call_block_and_release + 11 
9  libdispatch.dylib      0x39628ecf _dispatch_queue_drain$VARIANT$mp + 143 
10 libdispatch.dylib      0x39628dc1 _dispatch_queue_invoke$VARIANT$mp + 41 
11 libdispatch.dylib      0x3962991d _dispatch_root_queue_drain + 185 
12 libdispatch.dylib      0x39629ac1 _dispatch_worker_thread2 + 85 
13 libsystem_c.dylib      0x3824da11 _pthread_wqthread + 361 

Antwort

6

Sie müssen diesen Crash-Bericht symbolicate. Nummer 7 ist die Linie, an der Sie interessiert sind, aber es gibt keine Symbolinformationen, so dass der Absturzbericht nicht in etwas Sinnvolles übersetzt werden kann. Um zu symbolisieren, benötigen Sie den genauen Code, der in Ihrer App Store-Version verwendet wurde. Falls Sie Fragen haben, dann können Sie diese Antwort verweisen:

https://stackoverflow.com/a/13280585/1155387

Was die anderen Dinge:

1) Seien Sie nicht so schnell sein, eine interne API Fehler zu übernehmen. Ihre Funktion ändert offensichtlich die Hintergrundfarbe einer Ansicht, die intern verschiedene Methoden aufruft. Es wurde wahrscheinlich irgendwie ein ungültiger Wert übergeben. Sei nicht so naiv, dass du denkst, dass der Code, den du schreibst, der einzige Code ist, der jemals ausgeführt wurde.

2) Die Zeichen + geben den Offset dieses Codes innerhalb des binären Objekts an. Nicht nützlich für dich.

3) Sie können leicht einen Speicherfehler mit ARC haben, weil ARC nur den Bereich Objective-C betrifft. Alle CoreFoundation-Objekte usw. werden nicht verwaltet. Das ist nicht unbedingt das, was hier passiert, aber ARC bedeutet nicht, dass du aufhören musst, gemeinsam über das Gedächtnis nachzudenken.

4) Siehe oben

5) Siehe oben

4

wäre ich bereit, Sie so etwas wie dies tat zu sein:

CALayer *layer = [CALayer layer]; 
layer.delegate = self; 

Und dann das Objekt „Selbst“ wurde, bevor die Zuordnung aufgehoben letzter Verweis auf den CALayer wurde fallen gelassen. Eine Delegateigenschaft enthält kein Verweis auf das Objekt, das Sie als den layer.delegate-Wert festlegen. Dies hat nichts mit ARC zu tun (ARC fixiert nicht alle Pointer in Ihrer App).

Zuerst sollten Sie sich den Code ansehen, in dem Sie einen CALayer-Delegaten festlegen, und sicherstellen, dass dieser delegate ref auf null zurückgesetzt wird, wenn Ihr "self" -Objekt freigegeben wird. Das wird die Verbindung zwischen dem CALayer und Ihrem Objekt aufheben. Im Allgemeinen solltest du dein DSM in Crittercism hochladen, aber das wird in diesem Fall nicht viel ausmachen.