EXC_BREAKPOINT崩溃的原因范围

我在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)来测试它, 但我自己从未遇到崩溃,并且正确显示了firstname 。 它似乎也不是关于iOS版本,因为我收到iOS 8,9和10的崩溃。

在我最近的应用程序更新之后,我发生了很多这次崩溃(> 300)并且我不知道为什么它之前从未发生过,这里的代码不会通过更新而改变,我永远无法用受影响的用户重现它。

如果罪魁祸首只能是这个函数中的代码,而没有其他可能性(如multithreading,Realm等),我可以转而专注于服务器问题,比如’firstname’可能是一个空字符串。 但是,我仍然无法想象它会如何发生,因为我已经使用过这些用户帐户并且自己从未发生过这种崩溃。

非常感谢。

EXC_BREAKPOINT总是通过执行某种类型的陷阱指令(*)来触发,并且exception直接传递给执行陷阱指令的线程。 因此,如果你看到一个崩溃报告,说这个带有这个堆栈的线程有一个EXC_BREAKPOINT,这意味着该线程确实对执行了一个陷阱指令的东西做了什么。

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

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