Являются ли исключения «EXC_BREAKPOINT (SIGTRAP)» причиной отладки точек останова? - PullRequest
75 голосов
/ 10 апреля 2010

У меня есть многопоточное приложение, которое очень стабильно на всех моих тестовых машинах и кажется стабильным почти для каждого из моих пользователей (без жалоб на сбои). Однако приложение часто дает сбой одному пользователю, который был достаточно любезен, чтобы отправлять отчеты о сбоях. Все отчеты о сбоях (~ 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] и objc_exception_throw. Однако приложение определенно было создано с использованием «Release» в качестве активной конфигурации сборки. Я предполагаю, что использование конфигурации «Release» предотвращает установку каких-либо точек останова, но, опять же, я не уверен точно, как работают точки останова или нужно ли запускать программу изнутри gdb, чтобы точки останова имели какой-либо эффект.

Мои вопросы: может ли мой отказ от установленных точек останова стать причиной сбоев, наблюдаемых пользователем? Если это так, почему точки останова могут вызвать проблемы только для этого одного пользователя? Если нет, у кого-нибудь еще были подобные проблемы с [NSFont fontWithName: size:]?

Возможно, я просто попытаюсь удалить точки останова и отправить их обратно пользователю, но я не уверен, сколько валюты у меня осталось у этого пользователя. И я хотел бы понять в более общем плане, может ли оставить установленную точку останова вызвать проблему (когда приложение построено с использованием конфигурации "Release").

Ответы [ 4 ]

176 голосов
/ 10 апреля 2010

Являются ли исключения «EXC_BREAKPOINT (SIGTRAP)» причиной отладки точек останова?

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

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

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

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

Вы имели в виду, что вы установили точки останова для этих функций и этого метода?

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

номер

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

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

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

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

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

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

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

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

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

номер

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

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

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

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

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

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

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

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

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

5 голосов
/ 10 апреля 2010

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

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

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

0 голосов
/ 12 октября 2016

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

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

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

  • один использует XCode около года назад.
  • другой использовал Visual C ++ около 15 лет назад.
0 голосов
/ 10 апреля 2010

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

...