Das Hinzufügen von Protokollschnipsel zum Absturzprotokoll funktionierte bisher sehr gut, daher füge ich dies als Antwort vorerst hinzu. (Bessere Antworten sind auf jeden Fall willkommen :-))
Vorbereitungen:
callStackSymbols hinzufügen an den entsprechenden Stellen im Quellcode Anmeldung:
NSLog(@"call stack:\n%@", [NSThread callStackSymbols]);
die App zum Absturz bringen (zum Beispiel, wenn ein bestimmter Bildschirm geöffnet ist):
strcpy(0, "000");
Redirect Logging Ausgabe in eine Datei:
FILE *logfile = freopen([pathForLog cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
Ausführung:
In Xcode läuft die App einmal, so wird es auf dem Gerät installiert und dann stoppen. Starten Sie dann die App direkt auf dem Gerät, damit Xcode den Absturz nicht abfangen kann.
Verwenden Sie die App, so dass der Call-Stack protokolliert wird (kann viele Male sein).
Schließlich die App zum Absturz (in meinem Fall, öffnen Sie einen bestimmten Bildschirm, der die schlechte strcpy aufruft).
bekommen die Dateien:
In Xcode öffnen "Fenster -> Geräte", wählen Sie das Gerät, wählen Sie die App und laden Sie die App Container, so dass die Log-Datei extrahiert werden kann.
Im selben Bildschirm öffnen Sie das Gerät Protokolle und exportieren Sie das Crash-Protokoll.
In Xcode öffnen Sie "Window -> Projects", wählen Sie das Projekt und zeigen Sie den abgeleiteten Datenordner im Finder (kleine Pfeiltaste rechts neben dem abgeleiteten Datenpfad). Navigieren Sie im abgeleiteten Datenordner zu "Build/Products/Debug-iphoneos /" und kopieren Sie MyApp.app und MyApp.app.dSYM.
Passen Sie die Crash-Protokoll:
Für mich ist es arbeitete Abschnitte zusätzliche Faden hinzufügen rechts vor „Binary Bilder:“. So finden Sie den Speicherort von "Binärbilder:". Fügen Sie eine Zeile "Thread 9999:" ein. Kopieren & das Call-Stack-Dumps einfügen und die führenden Leerzeichen Spalten entfernen, so dass es wie folgt aussieht:
2015-12-09 15:28:58.971 MyApp[21376:3050653] call tree (
Thread 9999:
0 MyApp 0x00000001001d95f8 -[MyClass myMethod:] + 100
1 UIKit 0x000000018a5fc2ac <redacted> + 172
2 UIKit 0x000000018a5d5ca4 <redacted> + 88
3 UIKit 0x000000018a5d5b8c <redacted> + 460
4 UIKit 0x000000018a5d5cc0 <redacted> + 116
5 UIKit 0x000000018a5d5b8c <redacted> + 460
6 UIKit 0x000000018a5d5cc0 <redacted> + 116
7 UIKit 0x000000018a5d5b8c <redacted> + 460
8 UIKit 0x000000018a8e85ac <redacted> + 460
9 UIKit 0x000000018a5d4abc <redacted> + 96
10 UIKit 0x000000018a935b7c <redacted> + 344
11 UIKit 0x000000018a9306f8 <redacted> + 124
12 UIKit 0x000000018aa584d8 <redacted> + 44
13 UIKit 0x000000018a933d9c <redacted> + 188
14 UIKit 0x000000018a70b668 <redacted> + 116
15 UIKit 0x000000018a70b454 <redacted> + 252
16 UIKit 0x000000018a70af38 <redacted> + 1404
17 UIKit 0x000000018a70a9a8 <redacted> + 124
18 UIKit 0x000000018a616d3c <redacted> + 312
19 UIKit 0x000000018a616bc4 <redacted> + 108
20 QuartzCore 0x0000000189dddc2c <redacted> + 284
21 libdispatch.dylib 0x000000019a3a96a8 <redacted> + 16
22 libdispatch.dylib 0x000000019a3aedb0 _dispatch_main_queue_callback_4CF + 1844
23 CoreFoundation 0x00000001850001f8 <redacted> + 12
24 CoreFoundation 0x0000000184ffe060 <redacted> + 1628
25 CoreFoundation 0x0000000184f2cca0 CFRunLoopRunSpecific + 384
26 GraphicsServices 0x000000018ff94088 GSEventRunModal + 180
27 UIKit 0x000000018a644ffc UIApplicationMain + 204
28 MyApp 0x0000000100093918 main + 124
29 libdyld.dylib 0x000000019a3da8b8 <redacted> + 4
Binary Images:
...
Die „Thread 9999:“ Linie macht das symbolicatecrash
Skript die nächsten Zeilen symbolicate will. Ich wählte 9999, also weiß ich, dass dies meine hinzugefügten Abschnitte waren.
Run symbolication:
Finden Sie die symbolicatecrash
Skript:
$ find /Applications/Xcode.app -name symbolicatecrash -type f
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
$
Der symbolication Befehl fast so geht:
$ symbolicatecrash myapp.crash MyApp.app.dSYM > myapp-sym.crash
Sie müssen DEVELOPER_DIR setzen und fügen Sie den Pfad das Skript, so sieht es schließlich so aus:
$ DEVELOPER_DIR='/Applications/Xcode.app/Contents/Developer' /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash myapp.crash MyApp.app.dSYM > myapp-sym.crash
Oder besser Sehvergnügen eingewickelt:
$ DEVELOPER_DIR='/Applications/Xcode.app/Contents/Developer' ...
/Applications/Xcode.app/Contents/SharedFrameworks/ ...
DTDeviceKitBase.framework/Versions/A/Resources/ ...
symbolicatecrash myapp.crash MyApp.app.dSYM > myapp-sym.crash
Das Ergebnis:
Die jetzt symbolicated Schnipsel wie folgt aussehen:
2015-12-09 15:28:58.971 MyApp[21376:3050653] call tree (
Thread 9999:
0 MyApp 0x00000001001d95f8 -[MyClass myMethod:] (MyFile.m:15)
1 UIKit 0x000000018a5fc2ac -[UIScrollView _willMoveToWindow:] + 172
2 UIKit 0x000000018a5d5ca4 __85-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]_block_invoke + 88
3 UIKit 0x000000018a5d5b8c -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] + 460
4 UIKit 0x000000018a5d5cc0 __85-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]_block_invoke + 116
5 UIKit 0x000000018a5d5b8c -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] + 460
6 UIKit 0x000000018a5d5cc0 __85-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]_block_invoke + 116
7 UIKit 0x000000018a5d5b8c -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] + 460
8 UIKit 0x000000018a8e85ac __UIViewWillBeRemovedFromSuperview + 460
9 UIKit 0x000000018a5d4abc -[UIView(Hierarchy) removeFromSuperview] + 96
10 UIKit 0x000000018a935b7c __71-[UIPresentationController _initViewHierarchyForPresentationSuperview:]_block_invoke596 + 344
11 UIKit 0x000000018a9306f8 -[UIPresentationController transitionDidFinish:] + 124
12 UIKit 0x000000018aa584d8 -[_UICurrentContextPresentationController transitionDidFinish:] + 44
13 UIKit 0x000000018a933d9c __56-[UIPresentationController runTransitionForCurrentState]_block_invoke_2 + 188
14 UIKit 0x000000018a70b668 -[_UIViewControllerTransitionContext completeTransition:] + 116
15 UIKit 0x000000018a70b454 -[UITransitionView notifyDidCompleteTransition:] + 252
16 UIKit 0x000000018a70af38 -[UITransitionView _didCompleteTransition:] + 1404
17 UIKit 0x000000018a70a9a8 -[UITransitionView _transitionDidStop:finished:] + 124
18 UIKit 0x000000018a616d3c -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 312
19 UIKit 0x000000018a616bc4 -[UIViewAnimationState animationDidStop:finished:] + 108
20 QuartzCore 0x0000000189dddc2c CA::Layer::run_animation_callbacks(void*) + 284
21 libdispatch.dylib 0x000000019a3a96a8 _dispatch_client_callout + 16
22 libdispatch.dylib 0x000000019a3aedb0 _dispatch_main_queue_callback_4CF + 1844
23 CoreFoundation 0x00000001850001f8 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
24 CoreFoundation 0x0000000184ffe060 __CFRunLoopRun + 1628
25 CoreFoundation 0x0000000184f2cca0 CFRunLoopRunSpecific + 384
26 GraphicsServices 0x000000018ff94088 GSEventRunModal + 180
27 UIKit 0x000000018a644ffc UIApplicationMain + 204
28 MyApp 0x0000000100093918 main (main.m:16)
29 libdyld.dylib 0x000000019a3da8b8 <redacted> + 4
Binary Images:
...
Wenn ich einen einfacheren Ansatz finden , das wird der Weg für mich sein. Es kann nützlich sein, ein Skript zu erstellen, das die Aufruf-Stacks aus der Protokolldatei zieht, die führenden Leerzeichen löscht und diese in das Crash-Protokoll einfügt.
Es gibt ein paar Möglichkeiten, dies zu tun, wenn symbolicatecrash nicht funktioniert, einschließlich atos, dwarfdump und LLDB. Es gibt eine sehr schöne Zusammenfassung über einen vollständigen Symbolisierungsprozess [https://www.apteligent.com/developer-resources/symbolic-an-ios-crash-report/?partner_code=GDC_so_symbolicateios], der von einigen sein kann zusätzliche Hilfe – cjbeauchamp