EXC_BREAKPOINT崩溃的原因范围

41

Fabric中出现了以下堆栈跟踪:

enter image description here

我的问题:从崩溃日志中可以看出,'formatMessageAuthorName'函数是导致此EXC_BREAKPOINT崩溃的唯一原因吗?例如,除了此函数内部的代码之外,是否还有其他可能导致崩溃的原因?

这是我的formatMessageAuthorName函数:

private static func formatMessageAuthorName(firstname: String, lastname: String?=nil) -> String {
    // Capitalise first character of firstname
    var Cap_firstname = firstname
    Cap_firstname.replaceRange(Cap_firstname.startIndex...Cap_firstname.startIndex, with: String(Cap_firstname[Cap_firstname.startIndex]).capitalizedString)


    guard let lastname = lastname else { return Cap_firstname }

    // if has lastname & first char, capitalise too and concat with firstname.
    if let firstCharLastName = lastname.characters.first {
        return "\(Cap_firstname) \(String(firstCharLastName).uppercaseString)."
    } else {
        return firstname
    }
}

我的假设

我知道唯一可能导致函数崩溃的线索是当“firstname”是一个空字符串时,它会在这里崩溃,因为它访问了无效的数组索引:

String(Cap_firstname[Cap_firstname.startIndex])

然而,我仍对这个假设持怀疑态度,因为我相当确定“firstname”不为空(它是从服务器检索的)。我甚至通过登录一些出现了这个崩溃的用户账户并使用该页面(MessageViewController)进行测试,但我从未遇到过这个崩溃,而且名字也显示正确。这似乎与iOS版本无关,因为我从iOS 8、9和10收到了崩溃报告。

我的应用最近更新后经常出现这个崩溃(>300次),我不知道原因,因为之前从未发生过,这里的代码在更新中没有改变,而且我无法复现受影响用户的情况。

如果罪魁祸首只能是此函数中的代码,而没有其他可能性(如多线程、Realm等),我可以将重点转向服务器问题,例如“firstname”可能是一个空字符串。但仍然无法想象发生这种情况的原因,因为我已经使用这些用户账户,而且从未遇到过这个崩溃。

非常感谢。


我也是,不确定发生了什么? - neobie
@aunnn,你找出问题出在哪里了吗? - FredFlinstone
@FredFlinstone 你好,弗雷德。不幸的是,我从未找出问题所在。 - aunnnn
@aunnn 好的,太遗憾了。感谢您回复我。 - FredFlinstone
1个回答

34

EXC_BREAKPOINT总是通过执行某种陷阱指令触发,并且异常直接传递给执行陷阱指令的线程。因此,如果您看到一个崩溃报告,其中包含这个线程和这个堆栈有一个EXC_BREAKPOINT,那么这意味着该线程确实执行了执行陷阱指令的操作。

您可以通过查看二进制文件中的崩溃地址来看到这一点,您将在那里看到某种陷阱指令。Swift标准库使用陷阱指令来信号各种无效访问错误,而该代码可能已经内联到正在崩溃的函数中。所以这解释了你上面的例子。

(*) EXC_BREAKPOINT也可以用于数据监视,但这里不是这样的情况,无论如何它们仍然会被传递到访问监视数据的线程...


很抱歉,我没有。 - aunnnn
@Jim Ingham,有没有办法找出在 Swift 标准库中哪个函数实际上导致了崩溃? - Valerio Santinelli
2
使用“陷阱”进行错误处理很好,因为它会在错误点停止零帧的进程。因此,在大多数情况下,堆栈上最底层的框架是罪魁祸首。如果您没有底层框架的符号,可以尝试向上查找堆栈,找到库中第一个公共入口点,因为最底层的框架很可能只是帮助该调用的实用函数。如果这发生在您代码的框架中,则 Swift 库调用很可能已内联到您的代码中。我认为目前没有很好的方法来跟踪 Swift 内联。 - Jim Ingham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接