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

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

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

79
задан Peter Hosey 26 August 2010 в 10:28
поделиться

3 ответа

Вызваны ли исключения «EXC_BREAKPOINT (SIGTRAP)» из-за точек останова отладки?

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

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

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

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

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

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

Нет.

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

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

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

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

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

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

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

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

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

Нет.

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

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

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

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

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

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

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

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

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

183
ответ дан 24 November 2019 в 10:09
поделиться

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

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

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

5
ответ дан 24 November 2019 в 10:09
поделиться

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

0
ответ дан 24 November 2019 в 10:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: