Являются "предоставление услуг по монтажу прерывания (обработчик 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 69

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, что означает, что мы не можем использовать это Раздел для обозначения журнала сбоев.

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

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

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

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

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

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

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

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

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

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