ios - Crashlytics iOS - 在第 0 行崩溃 - Swift 来源

标签 ios swift crash crashlytics

当发生崩溃时,我目前正面临一些 Swift 源文件的问题。事实上,在 Crashlytics 上,我有一个关于线路和崩溃原因的奇怪信息。它告诉我源代码已在 第 0 行 崩溃,并给我一个 SIGTRAP 错误。我读到当线程遇到断点时会发生此错误。但问题是这个错误是在我没有调试时发生的(来自 TestFlight 的应用程序测试)。

这是一个示例,当 Crashlytics 告诉我第 0 行有一个SIGTRAP 错误时:

// Method that crashs  
private func extractSubDataFrom(writeBuffer: inout Data, chunkSize: Int) -> Data? {  

        guard chunkSize > 0 else { // Prevent from having a 0 division  
            return nil  
        }  

        // Get nb of chunks to write (then the number of bytes from it)  
        let nbOfChunksToWrite: Int = Int(floor(Double(writeBuffer.count) / Double(chunkSize)))  
        let dataCountToWrite = max(0, nbOfChunksToWrite * chunkSize)  
        guard dataCountToWrite > 0 else {  
            return nil // Not enough data to write for now  
        }  

        // Extract data  
        let subData = writeBuffer.extractSubDataWith(range: 0..<dataCountToWrite)  
        return subData    
}  

另一个 Swift 文件,用于解释“writeBuffer.extractSubDataWith(range: 0..

public extension Data {  

    //MARK: - Public  
    public mutating func extractSubDataWith(range: Range) -> Data? {  

        guard range.lowerBound >= 0 && range.upperBound <= self.count else {  
            return nil  
        }  

        // Get a copy of data and remove them from self  
        let subData = self.subdata(in: range)  
        self.removeSubrange(range)  

        return subData  
    }  
}  

你能告诉我我做错了什么吗?或者这个奇怪的 SIGTRAP 错误会发生什么?

谢谢

最佳答案

一行零崩溃确实很奇怪。但是,在 Swift 代码中很常见。

Swift 编译器可以为您生成代码。对于泛型函数,这种情况经常发生,但也可能由于其他原因而发生。当编译器生成代码时,它还会为它生成的代码生成调试信息。此调试信息通常引用导致代码生成的文件。但是,编译器用一行 0 标记了这一切以区别于开发人员实际编写的代码。

这些通用函数也不必由您编写 - 我已经看到标准库函数也发生过这种情况。

(旁白:我相信 DWARF 标准实际上可以更准确地描述这种情况。但不幸的是,Apple 似乎并没有那样使用它。)

Apple 通过我多年前提交的 Radar 验证了此零线行为。如果您想确认,您还可以查看应用程序自己的调试数据(例如通过 dwarfdump)。

您可能想要尝试这样做的一个原因是,如果您真的不相信 Crashlytics 正确地标记了线条。他们的用户界面和原始崩溃数据之间有很多东西。可以想象出了什么问题。您可以确认这一点的唯一方法是获取崩溃地址 + 二进制文件,然后自己进行查找。如果 dwarfdump 告诉您这发生在第 0 行,则证实这只是编译时代码生成的产物。

不过,我倾向于认为 Crashlytics 用户界面没有任何问题。我只是想指出它的可能性。

至于 SIGTRAP - 一点也不奇怪。这只是表明正在运行的代码已决定终止进程。例如,这不同于 SIGBUS,在 SIGBUS 中操作系统执行终止。这可能是由 Swift 整数和/或范围边界检查引起的。您的代码确实在这两个地方都有一些类似的东西。而且,由于这对性能至关重要 - 将成为内联代码生成的主要候选对象。

更新

现在看来,至少在某些情况下,编译器现在也使用 <compiler-generated> 的文件名。 .我相信他们这样做是为了让这个案子更清楚。所以,可能是使用更新版本的 Swift,你会看到 <compiler-generated>:0 .这可能无助于追踪崩溃,但至少会使事情变得更加明显。

关于ios - Crashlytics iOS - 在第 0 行崩溃 - Swift 来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53872700/

相关文章:

ios - UITableView 在从纵向旋转到横向,再回到纵向时会更改大小

ios - 如何在 iOS 中强制 UISearchBar 文本为大写

ios - 在应用程序从后台返回之前,在 applicationDidEnterBackground 中添加的 View 不可见

ios - 更改选取器 View 内的字体颜色

ios - 为键为值的 JSON 创建模型

swift - "Extra argument ' 当传递 Swift 闭包时完成 ' in call"

android - Android 中强制关闭

ios - 然后在 Promisekit 中重新加载 tableview

iphone - ViewController长度无法识别的选择器已发送到iPhone中的实例

java - 当我尝试使对象不可见/可见时,我的android应用程序崩溃-Eclipse