Являются ли исключения" EXC BREAKPOINT (SIGTRAP)", вызванные точками останова отладки?

У меня есть многопоточное приложение, которое очень стабильно на всех моих тестовых машинах и кажется стабильным почти для каждого из моих пользователей (на основе жалоб на сбои). Приложение часто падает для одного пользователя, который был достаточно любезен, чтобы отправлять отчеты о сбоях. Все отчеты о сбоях (~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").

4 ответов


являются ли исключения "EXC_BREAKPOINT (SIGTRAP)", вызванные отладкой точек останова?

нет. На самом деле, наоборот: SIGTRAP (Trace trap) заставит отладчик сломать (прервать) вашу программу так же, как и фактическая точка останова. Но это потому, что отладчик всегда ломается при сбое, а SIGTRAP (как и несколько других сигналы) является одним из типов аварии.

SIGTRAPs обычно вызваны nsexceptions, но не всегда-это даже возможно прямо поднять один себе.

теперь я заметил, что забыл удалить некоторые точки останова отладки, включая _NSLockError, [nsexception raise] и objc_exception_throw.

это не контрольные точки. Две из них являются функциями и -[NSException raise] - Это метод.

вы имели в виду, что вы установили точки останова on функции, и этот метод?

Я предполагаю, что использование конфигурации "Release" предотвращает установку каких-либо точек останова--

нет.

настройки построить конфигурации. Они влияют на то, как Xcode создает ваши приложения.

точки останова не являются частью сборки; вы устанавливаете их в отладчике. Они существуют только, только попадают и останавливают вашу программу только при запуске программы под отладчиком.

поскольку они не являются частью сборки, невозможно передайте свои точки останова пользователю, просто предоставив им пакет приложений.

Я точно не знаю, как работают точки останова ...

когда ваша программа попадает в точку останова, отладчик прерывает (прерывает) вашу программу, после чего вы можете изучить состояние программы и осторожно шагнуть вперед, чтобы увидеть, как программа идет не так.

поскольку это отладчик, который останавливает вашу программу, точки останова не влияют, когда вы не запускаете свою программу под отладчик.

... или нужно ли запускать программу из gdb, чтобы точки останова имели какой-либо эффект.

это делает. Точки останова отладчика работают только внутри отладчика.

мои вопросы: Может ли то, что я оставил установленные точки останова, быть причиной сбоев, наблюдаемых пользователем?

нет.

во-первых, как уже отмечалось, даже если эти точки удалось перенесены на пользователя системы останова действует только в отладчике. Отладчик не может остановиться на точке останова, если программа не запущена под отладчиком. Пользователь почти наверняка не запускает приложение под отладчиком, тем более, что они получили журнал сбоев из него.

даже если они запустили ваше приложение под отладчиком со всеми этими установленными точками останова, точка останова попадает только тогда, когда ваша программа достигает этой точки, поэтому одна из этих точек останова может сработать, только если вы или Cocoa вызвали _NSLockError, -[NSException raise] или objc_exception_throw. Достижение этой точки не будет причиной проблемы, это будет симптомом проблемы.

и если вы сделали сбой в результате одного из тех, которые вызываются, ваш журнал сбоев будет иметь по крайней мере один из них назван в нем. Это не так.

Итак, это не было связано с вашими точками останова (другая машина, отладчик не участвует), и это не было исключением какао-как я уже упоминал, исключения какао являются одной из причин SIGTRAPs, но они не являются единственный. Вы столкнулись с другим.

если нет, у кого-нибудь еще были подобные проблемы с [nsfont fontWithName:size:]?

мы никак не можем сказать, похожи ли какие-либо проблемы, которые у нас были, потому что вы отрезали журнал сбоев. Мы ничего не знаем о том, в каком контексте произошла авария.

единственное, что хорошо вырезать, это раздел "двоичные изображения", так как у нас нет ваших пакетов dSYM, а это означает, что мы не можем использовать это раздел symbolicate краш лог.

вы, с другой стороны, может. Я написал приложение для этой цели; подайте ему журнал сбоев, и он должен автоматически обнаружить пакет dSYM (вы сохраняете пакет dSYM для каждой сборки выпуска, которую вы распространяете, верно?) и восстановите свои имена функций и методов в трассировке стека, где бы ни появлялись ваши функции и методы.

для получения дополнительной информации см. Xcode Для Отладки Руководство.


весьма вероятно, что у этого пользователя установлен поврежденный шрифт. Трассировка стека определенно поддерживает эту гипотезу, как и тот факт, что она затрагивает только одного пользователя.

в этом случае вы мало что можете сделать, кроме как заставить пользователя удалить оскорбительный шрифт, поскольку сбои, которые происходят, происходят глубоко в коде Apple.

попробуйте заставить пользователя запустить проверку шрифта в книге шрифтов. Для этого запустите Font Book, нажмите Все Шрифты in список источников, а затем выберите Все перечисленные шрифты. Затем вы можете выбрать Проверка Шрифтов С .


точки останова не записываются в двоичный файл. Велики шансы, что у этого человека сломана установка ОС. Проверьте журналы консоли на наличие сообщений dyld.


У меня была такая же ошибка. По необъяснимой причине точка останова была ответственна за бросание EXC_BREAKPOINT исключения. Решение состояло в том, чтобы удалить точку останова, а затем код работает.

EXC_BREAKPOINT - Это тип исключения, который используют отладчики. При установке точки останова в коде компилятор вставляет исключение этого типа в исполняемый код. Когда выполнение достигает этой точки, возникает исключение и отладчик ловит его. Затем отладчик показывает ваш код в строке "breakpointed". Вот как работают отладчики. Но в этом случае отладчик не обрабатывает исключение правильно и представлен как обычная ошибка исключения.

Я нашел эту ошибку два раза в моей жизни:

  • один, использующий Xcode около года назад.
  • другой использует Visual C++ около 15 лет назад.