У меня есть многопоточное приложение, которое очень стабильно на всех моих тестовых машинах и кажется стабильным почти для каждого из моих пользователей (на основе отсутствия жалоб на сбои). Однако приложение часто дает сбой для одного пользователя, который любезно отправил отчеты о сбоях. Все отчеты о сбоях (~ 10 последовательных отчетов) выглядят практически одинаково:
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
(.... следует еще текст)
Во-первых, я потратил много времени на изучение [NSFont fontWithName: size:]. Я подумал, что, возможно, пользовательские шрифты каким-то образом облажались, поэтому [NSFont fontWithName: size:] запрашивал что-то несуществующее и по этой причине не работал. Я добавил кучу кода, используя [[NSFontManager sharedFontManager] availableFontNamesWithTraits: NSItalicFontMask], чтобы заранее проверить наличие шрифта. К сожалению, эти изменения не устранили проблему.
Теперь я заметил, что забыл удалить некоторые точки останова отладки, в том числе _NSLockError, [NSException raise] и objc_exception_throw. Однако приложение определенно было построено с использованием «Release» в качестве активной конфигурации сборки. Я предполагаю, что использование конфигурации «Release» предотвращает установку любых точек останова - но опять же, я не уверен, как именно работают точки останова и нужно ли запускать программу изнутри gdb, чтобы точки останова имели какой-либо эффект.
У меня следующие вопросы: может ли мой выход из установленных точек останова быть причиной сбоев, наблюдаемых пользователем? Если да, то почему точки останова могут вызывать проблемы только у этого пользователя? Если нет, то были ли у кого-нибудь подобные проблемы с [NSFont fontWithName: size:]?
Я, вероятно, просто попробую удалить точки останова и отправить обратно пользователю, но я не уверен, сколько валюты у меня осталось у этого пользователя. И я хотел бы в более общем плане понять, может ли оставление установленных точек останова вызвать проблему (когда приложение построено с использованием конфигурации «Release»).
Весьма вероятно, что у этого пользователя установлен поврежденный шрифт. Трассировка стека определенно подтверждает эту гипотезу, как и тот факт, что она затрагивает только одного пользователя.
В этом случае вы мало что можете сделать, кроме как заставить пользователя удалить неправильный шрифт, поскольку возникающие сбои происходят глубоко в коде Apple.
Попробуйте заставить пользователя запустить проверку шрифта в Font Book. Для этого запустите Font Book, нажмите All Fonts в списке источников и затем выберите все перечисленные шрифты. Затем вы можете выбрать « Проверить шрифты» в меню « Файл» .
источник
Точки останова не записываются в двоичный файл. Скорее всего, у этого человека не работает установка ОС. Проверьте журналы консоли на наличие dyld-сообщений.
источник
У меня была такая же ошибка. По необъяснимой причине точка останова была ответственна за выброс EXC_BREAKPOINT исключения . Решением было удалить точку останова, и тогда код заработал.
EXC_BREAKPOINT - это тип исключения, которое используют отладчики. Когда вы устанавливаете точку останова в своем коде, компилятор вставляет исключение этого типа в исполняемый код. Когда выполнение достигает этой точки, генерируется исключение, и отладчик его перехватывает. Затем отладчик показывает ваш код в строке с точкой останова. Так работают отладчики. Но в этом случае отладчик некорректно обрабатывает исключение и отображается как обычная ошибка исключения.
Я встречал эту ошибку два раза в жизни:
источник