2013-09-03 3 views
3

Я нашел решение проблемы ниже, когда включен параметр «Guard malloc» в «Edit Schema-> Diagnostic». Сторонний код использует память не по-своему.iOS advanced debug


Я получил несколько случайных сбоев в приложении iOS (с ARC, см. Ниже). Мне кажется, что это происходит из-за переопределенных объектов.

Я попытался включить NSZombie в xCode, но не получил никаких предупреждений в консоли перед сбоем. Та же проблема с Zombies инструмент - ошибок не обнаружено. Точка останова на «Все исключения» останавливается на objc_msgSend или что-то в этом роде.

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

Итак, кто-нибудь знает какие-либо другие передовые методы поиска источников ошибок в iOS? Образцы: цепочек вызовов

#0 0x3c2e1cda in realizeClass(class_t*)() 
#1 0x3c2e1d46 in realizeClass(class_t*)() 
#2 0x3c2e1d46 in realizeClass(class_t*)() 
#3 0x3c2dc094 in prepareForMethodLookup() 
#4 0x3c2dbf9a in lookUpMethod() 
#5 0x3c2dbf66 in _class_lookupMethodAndLoadCache3() 
#6 0x3c2db61a in objc_msgSend_uncached() 
#7 0x3627784c in -[UIButtonContent dealloc]() 
#8 0x34388310 in CFRelease() 
#9 0x34463434 in __CFBasicHashDrain() 
#10 0x343883d0 in CFRelease() 
#11 0x3627dee6 in -[UIButton dealloc]() 
#12 0x3627e0b4 in -[UIView dealloc]() 
#13 0x34388310 in CFRelease() 
#14 0x3439295c in -[__NSArrayM dealloc]() 
#15 0x3c2dd488 in (anonymous namespace)::AutoreleasePoolPage::pop(void*)() 
#16 0x3438a440 in _CFAutoreleasePoolPop() 
#17 0x34cbb782 in -[NSAutoreleasePool drain]() 
#18 0x341ce2ca in -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:]() 
#19 0x341cd10e in _performRunLoopAction() 
#20 0x3441c6cc in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() 
#21 0x3441a9c0 in __CFRunLoopDoObservers() 
#22 0x3441ad16 in __CFRunLoopRun() 
#23 0x3438debc in CFRunLoopRunSpecific() 
#24 0x3438dd48 in CFRunLoopRunInMode() 
#25 0x37f402ea in GSEventRunModal() 
#26 0x362a3300 in UIApplicationMain() 
#27 0x000a879c in main at main.m:16 

#0 0x3c2db5be in objc_msgSend() 
#1 0x34388aaa in CFDictionaryGetValue() 
#2 0x362656cc in -[UIButton(UIButtonContentLookup) _contentForState:]() 
#3 0x36274f38 in -[UIButton(UIButtonContentLookup) _backgroundForState:usesBackgroundForNormalState:]() 
#4 0x36274e54 in -[UIButton contentRectForBounds:]() 
#5 0x362954c4 in -[UIButton layoutSubviews]() 
#6 0x36252802 in -[UIView(CALayerDelegate) layoutSublayersOfLayer:]() 
#7 0x35ffcd8a in -[CALayer layoutSublayers]() 
#8 0x35ffc928 in CA::Layer::layout_if_needed(CA::Transaction*)() 
#9 0x35ffd85c in CA::Layer::layout_and_display_if_needed(CA::Transaction*)() 
#10 0x35ffd242 in CA::Context::commit_transaction(CA::Transaction*)() 
#11 0x35ffd050 in CA::Transaction::commit()() 
#12 0x35ffceb0 in CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*)() 
#13 0x3441c6cc in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() 
#14 0x3441a9c0 in __CFRunLoopDoObservers() 
#15 0x3441ad16 in __CFRunLoopRun() 
#16 0x3438debc in CFRunLoopRunSpecific() 
#17 0x3438dd48 in CFRunLoopRunInMode() 
#18 0x37f402ea in GSEventRunModal() 
#19 0x362a3300 in UIApplicationMain() 
#20 0x0007479c in main at main.m:16 

#0 0x33750f78 in objc_msgSend() 
#1 0x35a7b2e6 in CFRelease() 
#2 0x35af7b36 in __CFDictionaryStandardReleaseValue() 
#3 0x35b4b3bc in __CFBasicHashDrain() 
#4 0x35a7b39a in CFRelease() 
#5 0x332a0c88 in -[UIButton dealloc]() 
#6 0x33752174 in _objc_rootRelease() 
#7 0x35a7b2e6 in CFRelease() 
#8 0x35a9106a in -[__NSArrayM dealloc]() 
#9 0x33752174 in _objc_rootRelease() 
#10 0x33753e56 in objc_release() 
#11 0x33752eac in (anonymous namespace)::AutoreleasePoolPage::pop(void*)() 
#12 0x33752dc8 in _objc_autoreleasePoolPop() 
#13 0x35a82cfe in _CFAutoreleasePoolPop() 
#14 0x34f5898c in __NSFireDelayedPerform() 
#15 0x35b06a32 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__() 
#16 0x35b06698 in __CFRunLoopDoTimer() 
#17 0x35b0526e in __CFRunLoopRun() 
#18 0x35a884a4 in CFRunLoopRunSpecific() 
#19 0x35a8836c in CFRunLoopRunInMode() 
#20 0x33823438 in GSEventRunModal() 
#21 0x33260cd4 in UIApplicationMain() 
#22 0x001185b8 in main at main.m:16 
#23 0x000f7d78 in start() 
+0

Я нашел решение с «Guard Malloc» – Ihar

ответ

1

Просто обрисовать, что сказал ThisDarkTao.

Если вы идете в меню точки останова:

enter image description here

и нажмите на плюс в левом нижнем углу:

enter image description here

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

enter image description here

+0

. Совет подсказок полезен, но не в моем случае - он останавливается на 'obj_msgSend' – Ihar

+6

Это не исключение, это тяжелая авария. Таким образом, контрольная точка исключения не поможет. – bbum

3

Это не catchable исключение; нет броска. Это тяжелая авария. Скорее всего, из-за повреждения памяти, далее подтверждено, потому что NSZombie не помогло.

Хотя это, в общем, обман Debugging over-released objects, problem with NSZombie, существует определенный контекст, характерный для тех аварий, которые могут помочь.

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

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

+0

Большое спасибо, но я прочитал ваше сообщение перед тем, как задать этот вопрос, и я не мог представить, как мы можем получить повреждение памяти без манипуляции с необработанными указателями в стиле C. Но в любом случае рассмотрим код манипулирования изображениями – Ihar

+0

@Ihar Yeah - эти виды ошибок грубым образом отслеживаются. – bbum