2015-11-09 7 views
1

У меня есть приложение, которое показывает RSSI и некоторые другие вещи из Beacon. Как вы все знаете, RSSI отображается для пользователя, показывая его в tableView, который обновляется каждую секунду (очень быстро). В tableView я вызываю класс, кто что-то делает. Класс вычисляется, и вычисления занимают несколько секунд. Ошибка, которую я получаю, - lldb. Когда я набираю bt, я получаю эту информацию.Тема 1 Ошибка Sigabrt xcode

* thread #1: time = 0x3d0fd, 0x0000000197c07140 libsystem_kernel.dylib`__pthread_kill + 8, queue = 'com.apple.main-thread', stop reason = signal SIGABRT 
    frame #0: 0x0000000197c07140 libsystem_kernel.dylib`__pthread_kill + 8 
    frame #1: 0x0000000197cd0ef8 libsystem_pthread.dylib`pthread_kill + 112 
    frame #2: 0x0000000197b7ac18 libsystem_c.dylib`__abort + 148 
    frame #3: 0x0000000197b7b494 libsystem_c.dylib`__stack_chk_fail + 224 
    * frame #4: 0x00000001000eae98 ssProject`-[myClass ft:::](self=0x000000014e9320f0, _cmd="ft:::", size=2048, startRing=0, [email protected]"2837 objects") + 1380 at myClass:173 
    frame #5: 0x00000001000eb4ec ssProject `-[myClass cl::](self=0x000000014e9320f0, _cmd="cl::", [email protected]"514 objects", [email protected]"514 objects") + 1620 at myClass:260 
    frame #6: 0x00000001000e2034 ssProject `-[TagViewController tableView:cellForRowAtIndexPath:]([email protected]"0 objects", _cmd="tableView:cellForRowAtIndexPath:", tableView=0x0000000148828c00, indexPath=0xc000000000000016) + 1624 at TagViewController.m:184 
    frame #7: 0x00000001880ba20c UIKit`-[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 688 
    frame #8: 0x00000001880ba364 UIKit`-[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 80 
    frame #9: 0x00000001880a97b8 UIKit`-[UITableView _updateVisibleCellsNow:isRecursive:] + 2440 
    frame #10: 0x00000001880bef0c UIKit`-[UITableView _performWithCachedTraitCollection:] + 104 
    frame #11: 0x0000000187e5722c UIKit`-[UITableView layoutSubviews] + 176 
    frame #12: 0x0000000187d677ac UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 644 
    frame #13: 0x0000000187566b58 QuartzCore`-[CALayer layoutSublayers] + 148 
    frame #14: 0x0000000187561764 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 292 
    frame #15: 0x0000000187561624 QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 32 
    frame #16: 0x0000000187560cc0 QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 252 
    frame #17: 0x0000000187560a08 QuartzCore`CA::Transaction::commit() + 512 
    frame #18: 0x000000018755a0f8 QuartzCore`CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 80 
    frame #19: 0x000000018278fbd0 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32 
    frame #20: 0x000000018278d974 CoreFoundation`__CFRunLoopDoObservers + 372 
    frame #21: 0x000000018278dda4 CoreFoundation`__CFRunLoopRun + 928 
    frame #22: 0x00000001826bcca0 CoreFoundation`CFRunLoopRunSpecific + 384 
    frame #23: 0x000000018d8f8088 GraphicsServices`GSEventRunModal + 180 
    frame #24: 0x0000000187dd4ffc UIKit`UIApplicationMain + 204 
    frame #25: 0x00000001000e9680 swimsimulator`main(argc=1, argv=0x000000016fd27ae8) + 116 at main.m:14 
    frame #26: 0x0000000197aea8b8 libdyld.dylib`start + 4 

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

+0

Нет смысла обновлять представление таблицы быстрее, чем частота обновления дисплея (60 Гц) – NobodyNada

+0

Не могли бы вы обновить сообщение с кодом, на который вы набрасываетесь 'sigabrt'? – Chris

+0

Я добавил код к вопросу @Chris – TheZozoOwner

ответ

1

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

Для таких вещей адрес Sanitizer (ASAN) - хороший инструмент для использования. Включите его на вкладке «Диагностика» схемы запуска для вашего проекта. Затем вам нужно сделать перестройку, чтобы использовать ее, поэтому ошибка должна быть в вашем коде. Но если вы можете использовать его, неплохо поймать такие виды ошибок, когда они происходят, что делает диагностику намного легче, чем улавливать некоторый побочный эффект ошибки когда-нибудь позже.