定期IOS崩溃,但我没有看到我的应用程序参与崩溃报告

时间:2017-04-05 09:43:36

标签: ios10.2 swift3.1 xcode8

大约每周一次,我就像这样崩溃了。也许我错了,但我没有看到我的应用程序的任何参与(“WayAndSee”)。有没有人提示如何继续?

附上崩溃报告(通常是针对那种崩溃),我只是截断了库的尾随列表。

非常感谢...

Incident Identifier: 348BDC52-6574-4EED-A6C7-45E79E696875
CrashReporter Key:   f8ac3e1a61b8129920a4ad40aaa56d5536e2ce22
Hardware Model:      iPhone6,2
Process:             WayAndSee [8286]
Path:                /private/var/containers/Bundle/Application/F1542EC3-3708-4B6E-80EA-A2333883359E/WayAndSee.app/WayAndSee
Identifier:          Hobrink.WayAndSee
Version:             2487 (0.3.0)
Code Type:           ARM (Native)
Role:                Foreground
Parent Process:      launchd [1]
Coalition:           Hobrink.WayAndSee [2936]


Date/Time:           2017-04-04 14:28:15.3459 +0200
Launch Time:         2017-04-04 13:05:54.5835 +0200
OS Version:          iPhone OS 10.2.1 (14D27)
Report Version:      104

Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d
Triggered by Thread:  0

Filtered syslog:
None found

Thread 0 Crashed:
0   libsystem_kernel.dylib          0x1cedf84c mach_msg_trap + 20
1   CoreFoundation                  0x1d7082f9 __CFRunLoopServiceMachPort + 137
2   CoreFoundation                  0x1d7065f7 __CFRunLoopRun + 1015
3   CoreFoundation                  0x1d655533 CFRunLoopRunSpecific + 487
4   CoreFoundation                  0x1d655341 CFRunLoopRunInMode + 105
5   GraphicsServices                0x1ee2cbfd GSEventRunModal + 157
6   UIKit                           0x22863e67 -[UIApplication _run] + 575
7   UIKit                           0x2285e591 UIApplicationMain + 151
8   WayAndSee                       0x000ba890 main (AppDelegateV2a.swift:667)
9   libdyld.dylib                   0x1ce1f50b start + 3

Thread 1 name:  com.apple.uikit.eventfetch-thread
Thread 1:
0   libsystem_kernel.dylib          0x1cedf84c mach_msg_trap + 20
1   CoreFoundation                  0x1d7082f9 __CFRunLoopServiceMachPort + 137
2   CoreFoundation                  0x1d7065f7 __CFRunLoopRun + 1015
3.  CoreFoundation                  0x1d655533 CFRunLoopRunSpecific + 487
4   CoreFoundation                  0x1d655341 CFRunLoopRunInMode + 105
5   Foundation                      0x1dfaf88b -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 261
6   Foundation                      0x1dfce631 -[NSRunLoop(NSRunLoop) runUntilDate:] + 87
7   UIKit                           0x2316a2b3 -[UIEventFetcher threadMain] + 129
8   Foundation                      0x1e098b11 __NSThread__start__ + 1161
9   libsystem_pthread.dylib         0x1cfa9a27 _pthread_body + 217
10  libsystem_pthread.dylib         0x1cfa994d _pthread_start + 235
11  libsystem_pthread.dylib         0x1cfa749c thread_start + 8

Thread 2 name:  NetworkLoad
Thread 2:
0   libsystem_kernel.dylib          0x1cedf84c mach_msg_trap + 20
1   CoreFoundation                  0x1d7082f9 __CFRunLoopServiceMachPort + 137
2   CoreFoundation                  0x1d7065f7 __CFRunLoopRun + 1015
3   CoreFoundation                  0x1d655533 CFRunLoopRunSpecific + 487
4   CoreFoundation                  0x1d655341 CFRunLoopRunInMode + 105
5   GeoServices                     0x244775ff _runNetworkThread + 475
6   libsystem_pthread.dylib         0x1cfa9a27 _pthread_body + 217
7   libsystem_pthread.dylib         0x1cfa994d _pthread_start + 235
8   libsystem_pthread.dylib         0x1cfa749c thread_start + 8

Thread 3:
0   libsystem_kernel.dylib          0x1cef5744 __workq_kernreturn + 8
1   libsystem_pthread.dylib         0x1cfa7490 start_wqthread + 8

Thread 4:
0   libsystem_pthread.dylib         0x1cfa7488 start_wqthread + 0

Thread 5:
0   libsystem_pthread.dylib         0x1cfa7488 start_wqthread + 0

Thread 6:
0   libsystem_pthread.dylib         0x1cfa7488 start_wqthread + 0

Thread 0 crashed with ARM Thread State (32-bit):
    r0: 0x10004005    r1: 0x07000806      r2: 0x00000000      r3: 0x00000c00
    r4: 0x00002403    r5: 0xffffffff      r6: 0x00000000      r7: 0x0042adb4
    r8: 0x00000c00    r9: 0x00002403     r10: 0x07000806     r11: 0x00000000
    ip: 0xffffffe1    sp: 0x0042ad78      lr: 0x1cedf63f      pc: 0x1cedf84c
  cpsr: 0x60000010

Binary Images:
0xb0000 - 0x177fff WayAndSee armv7  <7506039ae577329ab9868e3122d84f5f> /var/containers/Bundle/Application/F1542EC3-3708-4B6E-80EA-A2333883359E/WayAndSee.app/WayAndSee
0x25c000 - 0x267fff libswiftCoreData.dylib armv7s  <3022e21a184d3e6c93bac1ad7b18be30> /var/containers/Bundle/Application/F1542EC3-3708-4B6E-80EA-A2333883359E/WayAndSee.app/Frameworks/libswiftCoreData.dylib
0x27c000 - 0x28bfff libswiftCoreGraphics.dylib armv7s  <4415e467b6df386591e646e7a2978da6> /var/containers/Bundle/Application/F1542EC3-3708-4B6E-80EA-A2333883359E/WayAndSee.app/Frameworks/libswiftCoreGraphics.dylib
0x2a8000 - 0x2affff libswiftCoreImage.dylib armv7s  <9bbbe5b77fdd3551921ca7ec1a98ae38> /var/containers/Bundle/Application/F1542EC3-3708-4B6E-80EA-A2333883359E/WayAndSee.app/Frameworks/libswiftCoreImage.dylib
0x2c0000 - 0x2ebfff dyld armv7s  <898b6b42ae3b3ffb8de9a96b7071f49d> /usr/lib/dyld
0x42c000 - 0x6abfff libswiftCore.dylib armv7s  <b760608c5d35390099731eedb8821bc0> /var/containers/Bundle/Application/F1542EC3-3708-4B6E-80EA-A2333883359E/WayAndSee.app/Frameworks/libswiftCore.dylib

....

1 个答案:

答案 0 :(得分:3)

当我对这个问题的进展有几个疑问时,我决定自己写一个答案。也许这对其他人有帮助。

崩溃报告有一个重要的界限:“终止原因:命名空间SPRINGBOARD,代码0x8badf00d” - &gt; SPRINGBOARD尝试在后台启动应用程序......“0x8dadf00d”可以被读作“吃不好的食物”(在这里查看StackOverflow,该代码的大量解释)

该问题的根本原因只是启动时间。在后台开始太长了。背景开始的时间限制约为5到7秒。在前台发射的允许时间窗口约为20秒。

此时间限制包括BEFORE main()和AFTER main()之前的时间,直到app确定并准备好接收启动事件。每次在后台启动应用程序都是由启动事件(位置,文件传输等)引起的

为了了解如何分析main()之前的时间我建议观看视频“优化应用启动时间”,Session 406,WWDC 2016.他们详细解释了主要内容以及如何分析和测量它。它们描述了几个环境变量(在方案的“参数”部分中设置),它们产生有用的日志。

“main()”,是的,我在这次考试中学到了这一点。 Swift允许它有一个main()。甚至可以在函数,类,结构之外执行语句......在swift中没有真正需要它。但是因为我想测量main之后的启动时间,所​​以我写了这个简单的main.swift文件。

//
//  main.swift
//  ...
//
//  Created by Hartwig Hopfenzitz on 31.05.17.
//  Copyright © 2017 Hopfenzitz. All rights reserved.
//

import Foundation
import UIKit

// very first statement after load.. the current time
let WaysStartTime = CFAbsoluteTimeGetCurrent()

// build the parameters for the call to UIApplicationMain()
let argc = CommandLine.argc
let argv = UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc))

// start the main loop
UIApplicationMain(argc, argv, nil, NSStringFromClass(AppDelegate.self))

正如你所看到的:在第一个声明中我花时间。有了这个,我可以测量应用程序启动和运行时的时差。

但是:如果要在swift项目中使用main(),则必须在AppDelegate.swift中注释掉或删除“@UIApplicationMain”语句。该语句“模拟”main()函数,因此它将是多余的。

是的,值得在main()上开始测量。我还测试了从“willFinishLaunchingWithOptions:”开始的时间测量。在我通常的测试设备上,iPhone 5s(真正的测试设备,而不是模拟器),差异大约是0.4秒。我确定时间取决于应用程序及其结构,因此我建议从main()进行测量。

好的,并且一如既往:“如果你衡量,你就能管理”。

缓慢启动时间的常见根本原因是主线程过载。这个主线程是每个应用程序中最重要的工作马。它会增加事件循环和UI的负担。

所以我的第一步是通过使用GCD(Grand Central Dispatch)将尽可能多的工作转移到主要威胁之外。 GCD非常易于使用,并为您提供了许多选项来微调多个线程的工作负载。 WWDC上有几个关于GCD的视频,我个人最喜欢的一个是“使用GCD构建响应和高效的应用程序”,第718课,WWDC 2015。

然而,通过这个我大幅减少了崩溃次数,但是......仍然有崩溃......

我的初始屏幕非常复杂,使用了很多自动布局和自动调整等。在时间限制崩溃应用程序之前,有时需要很长时间才能完成渲染。如果我理解一切正确,IOS希望第一个屏幕启动并运行,以考虑成功启动。

嗯,魔术词是“第一个屏幕”。

我喜欢我的Main.storyboard,非常漂亮,适应性强。所以我不想把它剥掉。幸运的是我找到了这个博客http://timdietrich.me/blog/swift-multiple-storyboards/。它描述了在swift / xcode项目中使用多个故事板所需的步骤。在互联网上还有其他几个可以找到,但这个很容易阅读和理解。

所以我创建了一个名为“Start.storyboard”的故事板。这个故事板非常简单,只是Launchscreen.storyboard的一个副本。我用这个作为“第一个屏幕”。

我为这个开始屏幕的ViewController创建了这个类,除了启动我的Main.Storyboard之外别无其他。

//
//  StartViewController.swift
//  ...
//
//  Created by Hartwig Hopfenzitz on 02.06.17.
//  Copyright © 2017 Hopfenzitz. All rights reserved.
//

import UIKit

class StartViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        // Create instance of our main storyboard
        let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)

        // Create the instance of main's initial view controller.
        let mainController = mainStoryboard.instantiateViewController(withIdentifier: "WaysViewController") as UIViewController

        // Make sure it will start on the main thread
        DispatchQueue.main.async(execute: {

            // present it .. and never come back
            mainController.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
            mainController.modalPresentationStyle = .fullScreen // Display on top of current UIView

            self.present(mainController, animated: true, completion: nil)
        })
    }
}

在Info.plist中,您将找到关键字“主故事板文件基本名称”。此键说明哪个故事板是具有初始屏幕的故事板。因此,在我的示例中,您必须将值从“Main”更改为“Start”,因为新的初始故事板称为“Start.storyboard”。

和Voilá:第一个屏幕几乎立即开始,IOS对发布时间感到非常高兴。用户无法识别它。

好吧,这就是我如何摆脱这种崩溃......也许它会帮助别人......

快乐编码; - )