J'ai cette trace de pile dans Fabric:
Ma question : À partir du journal des plantages, la fonction 'formatMessageAuthorName' est-elle la seule cause de ce crash EXC_BREAKPOINT? Par exemple, y a-t-il d'autres causes possibles du crash en dehors du code à l'intérieur de cette fonction?
Voici ma fonction 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
}
}
Mon hypothèse
Le seul indice que je connaisse qui fera planter la fonction est lorsque "prénom" est une chaîne vide, il plantera ici car il accède à un index de tableau non valide:
String(Cap_firstname[Cap_firstname.startIndex])
Cependant, je suis toujours sceptique à propos de cette hypothèse, car je suis tout à fait sûr que "prénom" n'est pas vide (il est récupéré du serveur). Je l'ai même testé en me connectant à certains comptes d'utilisateurs qui ont ce crash, et en utilisant cette page (MessageViewController), mais je n'ai jamais eu le crash moi-même et le prénom s'affiche correctement. Cela ne semble pas non plus concerner les versions iOS car j'ai reçu un plantage d'iOS 8, 9 et 10.
J'ai ce crash beaucoup (> 300) après ma récente mise à jour de l'application et je ne sais pas pourquoi, comme cela ne se produit jamais auparavant, le code ici ne change pas pendant la mise à jour, et je ne peux jamais le reproduire avec les utilisateurs concernés.
Si le coupable ne peut être que le code de cette fonction, et aucune autre possibilité (comme le multithread, le royaume, etc.), je peux me concentrer sur les problèmes de serveur à la place, comme la façon dont `` prénom '' peut être une chaîne vide. Mais encore, je ne peux pas imaginer comment cela pourrait se produire, car j'ai déjà utilisé ces comptes d'utilisateurs et n'ai jamais eu ce plantage moi-même.
Merci beaucoup.
EXC_BREAKPOINT est toujours déclenché par l'exécution d'une instruction d'interruption d'une certaine sorte (*) et l'exception est délivrée directement au thread qui a exécuté l'instruction d'interruption. Donc, si vous voyez un rapport d'erreur indiquant que ce thread avec cette pile a obtenu un EXC_BREAKPOINT, cela signifie que le thread a vraiment fait quelque chose qui a exécuté une instruction d'interruption.
Vous pourriez probablement voir cela en regardant l'adresse de plantage dans votre binaire, vous y verrez une sorte d'instruction d'interruption. La bibliothèque standard Swift utilise des instructions d'interruption pour signaler divers types d'erreurs d'accès non valides, et ce code a probablement été intégré dans la fonction qui plante. Cela a donc du sens pour votre exemple ci-dessus.
(*) EXC_BREAKPOINT peut également être utilisé pour les surveillances de données, mais ce n'est pas ce qui se passe ici, et de toute façon ils seraient toujours livrés au thread qui a accédé aux données surveillées ...