Сбой стека на внутренних методах, случается иногда (состояние гонки?) И только в симуляторе - PullRequest
3 голосов
/ 19 апреля 2011

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

Трассировка стека: Stack Trace

Я звоню:

UITextView *myTextView = [[UITextView alloc] initWithFrame:CGRectMake(0,0,100,100)];

И в большинстве случаев здесь нет проблем. Действительно расстраивает то, что проблема не в том, что я называю, а в некоторых внутренних проблемах WebFrame (я полагаю, что это внутренняя часть UITextView

Crashlog:

2011-04-18 14:34:48.729 MyApp[73336:40b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[WebFrame _isIncludedInWebKitStatistics]: unrecognized selector sent to instance 0xa901a50'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x03003be9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x031585c2 objc_exception_throw + 47
    2   CoreFoundation                      0x030056fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x02f75366 ___forwarding___ + 966
    4   CoreFoundation                      0x02f74f22 _CF_forwarding_prep_0 + 50
    5   WebKit                              0x03abc862 -[WebFrameView(WebInternal) _setWebFrame:] + 98
    6   WebKit                              0x03abc75f -[WebFrame(WebInternal) _initWithWebFrameView:webView:] + 239
    7   WebKit                              0x03af6565 +[WebFrame(WebInternal) _createMainFrameWithSimpleHTMLDocumentWithPage:frameView:withStyle:editable:] + 85
    8   WebKit                              0x03b30ad0 -[WebView(WebPrivate) initSimpleHTMLDocumentWithStyle:editable:withFrame:withPreferences:] + 1184
    9   UIKit                               0x019be211 -[UIWebDocumentView initSimpleHTMLDocumentWithStyle:editable:withFrame:withPreferences:] + 255
    10  UIKit                               0x019321e8 -[UITextView commonInitWithWebDocumentView:isDecoding:] + 443
    11  UIKit                               0x0192f5ce -[UITextView initWithFrame:] + 118

И там не всегда происходит сбой, иногда он проходит через этот вызов без проблем, а затем падает здесь:

Second Stack

Со следующим оправданием в журнале:

Program received signal:  “EXC_BAD_ACCESS”.

Опять же, в этом случае первоначальный вызов (представление контроллера модального представления) выполняется для допустимой цели с допустимыми параметрами, но в этот раз сбой, как представляется, сообщает misaligned_stack_error_ как виновную.

Обе эти проблемы начались примерно в одно и то же время и проявляются только в симуляторе, и только в 50% случаев (одна, другая или ни одна, кажется почти случайной).

Надеясь, что кто-то еще видел это и, возможно, сможет указать мне правильное направление!

Ответы [ 6 ]

2 голосов
/ 16 мая 2011

Проблема была действительно сложной, но похоже, что кто-то взломал эту гайку, мы использовали OS_vsnprintf (оболочку для POSIX vsnprintf) для функции ведения журнала и выводили журналы в буфер без проверки, превышала ли длина этих записей журнала размер буфера (используя \ 0 для завершения). Это приводило к переполнению буфера, что вызывало отравление других методов, вызывая их сбой при вызове.

Он присутствовал только в отладке, потому что действительно длинные записи журнала, которые вызывали переполнение буфера, присутствовали только в отладке. (Сложно!)

Так что, если у вас возникают подобные проблемы, вы можете проверить обработку строк и функциональность C, чтобы убедиться, что вы случайно не вызываете переполнения буфера!

0 голосов
/ 27 апреля 2011

Поскольку это происходит только в сборках симулятора (i386), а верхняя строка второй трассировки стека - misaligned_stack_error_, вы можете попробовать следующее:

Добавьте -mstackrealign к OTHER_CFLAGS в основном проекте.

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

• Определите две новые пользовательские настройки сборки:

OTHER_CFLAGS_iphoneos = $(OTHER_CFLAGS)
OTHER_CFLAGS_iphonesimulator = -mstackrealign $(OTHER_CFLAGS)

• Установите для параметра «Сборка других флагов C» значение:

$(OTHER_CFLAGS_$(PLATFORM_NAME))
0 голосов
/ 26 апреля 2011

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

Все объекты UIKit должны использоватьсятолько основной поток.

и Справочник по UIKit Framework :

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

0 голосов
/ 22 апреля 2011

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

Попробуйте запустить инструменты, поиск утечек памяти, зомби. Изучите все ваши вызовы dealloc, убедитесь, что вы обнуляете свойства и вызываете [super dealloc]. Хороший совет: когда вы отпускаете объект, тоже обнуляйте указатель на него, чтобы не было висящих ссылок.

Если инструменты не помогают, попробуйте определить, какие именно шаги необходимы для воспроизведения проблемы, чтобы вы знали, какие области следует включить в поиск, а какие не имеют значения. Начните комментировать код, чтобы исключить его. В конце концов вы достаточно сузите свой поиск и найдете виновника.

0 голосов
/ 22 апреля 2011

У меня недавно была странная проблема с сбоями. Вы недавно добавили какие-либо фреймворки или аргументы компилятора в ваш проект? Если это так, попробуйте временно очистить их и посмотрите, решит ли это вашу проблему. В моем случае проблема была в структуре UrbanAirship.

0 голосов
/ 19 апреля 2011

Забавные и странные!

Проблемы выравнивания адресов и неизвестные частные методы iOS SDK ...

Только на симуляторе, а не на устройстве ... с действительно базовым стандартным кодом, который работает везде...

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

Пробовал чистить / переустанавливать Xcode?


РЕДАКТИРОВАТЬ : Так как это не выглядит так:

  • проблема среды (не удается на любомкомпьютер)
  • проблема с кодом: еще раз, вставленный вами код действительно прост, убедитесь, что вы ничего не пропустили!чтобы быть уверенным, вставьте туда больше кода.

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

Если вы используете LLVM2, не могли бы вы попробовать GCC4.2 ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...