【问题标题】:Scope of causes for EXC_BREAKPOINT crashEXC_BREAKPOINT 崩溃的原因范围
【发布时间】:2017-07-15 01:19:47
【问题描述】:

我在 Fabric 中有这个堆栈跟踪:

我的问题:从崩溃日志中,函数 '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 等),我可以转而关注服务器问题,比如“名字”可能是空的细绳。但是,我仍然无法想象它是如何发生的,因为我已经使用了这些用户帐户并且我自己从未遇到过这种崩溃。

非常感谢。

【问题讨论】:

  • 这里也一样,不知道怎么回事?
  • @aunnn,您是否设法找出问题所在
  • @FredFlinstone 嗨,弗雷德。不幸的是,我从来不知道出了什么问题。
  • @aunnn 好吧,太糟糕了。感谢您回复我

标签: ios swift debugging crashlytics


【解决方案1】:

EXC_BREAKPOINT 总是通过执行某种类型的陷阱指令 (*) 来触发,并且异常会直接传递给执行陷阱指令的线程。所以如果你看到一个崩溃报告说这个堆栈的线程得到了一个 EXC_BREAKPOINT,这意味着这个线程确实对执行了一个陷阱指令的事情做了。

通过查看二进制文件中的崩溃地址,您可能会看到这一点,您会在那里看到某种陷阱指令。 swift 标准库使用陷阱指令来指示各种无效访问错误,并且该代码可能已内联到正在崩溃的函数中。所以这对你上面的例子很有意义。

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

【讨论】:

  • @Azat 不幸的是,我没有。
  • @Jim Ingham 有没有办法找到 swift 标准库中的哪些函数实际上是在捕获并导致崩溃?
  • 使用“陷阱”进行错误处理很好,因为它会在错误点的第零帧停止进程。所以在大多数情况下,堆栈中最底部的帧是罪魁祸首。如果您没有最底部框架的符号,您可以尝试在堆栈中查找库的第一个公共入口点,因为最底部框架可能只是帮助该调用的实用函数。如果这发生在您代码的某个框架中,则 swift 库调用可能已内联到您的代码中。我认为目前没有跟踪快速内联的好方法。
猜你喜欢
  • 2020-12-15
  • 2014-11-13
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 2013-10-08
相关资源
最近更新 更多