J'ai une application multithread qui est très stable sur toutes mes machines de test et semble être stable pour presque tous mes utilisateurs (d'après l'absence de plaintes de plantage). L'application plante fréquemment pour un utilisateur, qui a eu la gentillesse d'envoyer des rapports de plantage. Tous les rapports de plantage (~10 rapports consécutifs) sont essentiellement identiques :
Date/Time: 2010-04-06 11:44:56.106 -0700
OS Version: Mac OS X 10.6.3 (10D573)
Report Version: 6
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Thread 0 Crashed: Dispatch queue: com.apple.main-thread
0 com.apple.CoreFoundation 0x90ab98d4 __CFBasicHashRehash + 3348
1 com.apple.CoreFoundation 0x90adf610 CFBasicHashRemoveValue + 1264
2 com.apple.CoreText 0x94e0069c TCFMutableSet::Intersect(__CFSet const*) const + 126
3 com.apple.CoreText 0x94dfe465 TDescriptorSource::CopyMandatoryMatchableRequest(__CFDictionary const*, __CFSet const*) + 115
4 com.apple.CoreText 0x94dfdda6 TDescriptorSource::CopyDescriptorsForRequest(__CFDictionary const*, __CFSet const*, long (*)(void const*, void const*, void*), void*, unsigned long) const + 40
5 com.apple.CoreText 0x94e00377 TDescriptor::CreateMatchingDescriptors(__CFSet const*, unsigned long) const + 135
6 com.apple.AppKit 0x961f5952 __NSFontFactoryWithName + 904
7 com.apple.AppKit 0x961f54f0 +[NSFont fontWithName:size:] + 39
(....more text follows)
Tout d'abord, j'ai passé un long moment à étudier [NSFont fontWithName:size :]. Je me suis dit que les polices de l'utilisateur étaient peut-être mal fichues, de sorte que [NSFont fontWithName:size :] demandait quelque chose d'inexistant et échouait pour cette raison. J'ai ajouté un tas de code utilisant [[NSFontManager sharedFontManager] availableFontNamesWithTraits:NSItalicFontMask] pour vérifier la disponibilité des polices à l'avance. Malheureusement, ces modifications n'ont pas permis de résoudre le problème.
J'ai maintenant remarqué que j'ai oublié de supprimer certains points d'arrêt de débogage, notamment _NSLockError, [NSException raise] et objc_exception_throw. Cependant, l'application a bien été construite en utilisant "Release" comme configuration de construction active. Je suppose que l'utilisation de la configuration "Release" empêche la mise en place de tout point d'arrêt - mais là encore, je ne sais pas exactement comment fonctionnent les points d'arrêt ou si le programme doit être exécuté à partir de gdb pour que les points d'arrêt aient un quelconque effet.
Mes questions sont les suivantes : le fait que j'ai laissé les points d'arrêt définis pourrait-il être à l'origine des plantages observés par l'utilisateur ? Dans l'affirmative, pourquoi les points d'arrêt ne causeraient-ils un problème que pour cet utilisateur ? Sinon, quelqu'un d'autre a-t-il eu des problèmes similaires avec [NSFont fontWithName:size :]?
Je vais probablement essayer de supprimer les points d'arrêt et de les renvoyer à l'utilisateur, mais je ne sais pas combien de monnaie il me reste avec cet utilisateur. Et j'aimerais comprendre plus généralement si le fait de laisser les points d'arrêt définis peut éventuellement causer un problème (lorsque l'application est construite avec la configuration "Release").