【问题标题】:How to capture crashes in iOS Swift 3.0 using only iOS 10如何仅使用 iOS 10 在 iOS Swift 3.0 中捕获崩溃
【发布时间】:2017-06-09 08:35:03
【问题描述】:

我正在尝试使用 Swift 3.0 编写一些基本代码来捕获 iOS 10+ 中的崩溃,而不使用第三方库。

我发现了以下函数:

// Capturing exceptions 

NSSetUncaughtExceptionHandler { exception in
        print("Exception: \(exception.name) \(exception.reason!)\(exception.description)")
        print(exception.callStackSymbols)
    }

    // Capturing other crashes - **is this enough ????**
    // I wrote these in application didFinishLaunchingWithOptions method, but these don't get called. 
    signal(SIGABRT) {(a) in
        print(a)
    }

    signal(SIGABRT){(a) in
        print(a)
    }

    signal(SIGILL){(a) in
        print(a)
    }

    signal(SIGSEGV){(a) in
        print(a)
    }

    signal(SIGFPE){(a) in
        print(a)
    }

    signal(SIGBUS){(a) in
        print(a)
    }
    signal(SIGPIPE){(a) in
        print(a)
    }

1 - 这些方法够吗?

2 - 如果是这样,我应该在哪里调用他们来捕获崩溃?

为了触发崩溃,我在项目中唯一的 ViewController 对象的 ViewDidLoad 中编写了以下方法:

但是,这种方法给了我一个 EXC_BREAKPOINT 而不是上述崩溃之一。

3 - 如何以编程方式捕获 EXC_BREAKPOINT

4 - 还有其他方法可以尝试触发崩溃吗?

【问题讨论】:

    标签: ios objective-c swift crash crash-dumps


    【解决方案1】:

    您知道 iOS 有 TestFlight 并且您可以从 Apple 的网站上获取您的应用程序的任何崩溃?

    如果您这样做是出于教育目的,那很好,否则,您不需要编写崩溃处理代码。

    如果您只是为了好玩而这样做,我认为您的困惑来自 EXC_BREAKPOINT 是 CPU 异常,而不是 ObjC 异常这一事实。这些是使用标准 Unix 信号处理程序传递给您的应用程序的,因此您必须改用它。

    【讨论】:

    • 我这样做只是为了娱乐和教育目的。鉴于信号处理程序的优点,您是否同意我在回答中发布的内容?我在我的应用程序上使用“signal(SIGTRAP){(a) in print(a)}”对其进行了修改。不幸的是,当我运行我的应用程序时,打印代码没有执行。我错过了什么吗?我怎样才能让打印发生?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多