Как я могу узнать, произошел ли сбой по моей вине или сторонняя ошибка? - PullRequest
1 голос
/ 10 сентября 2011

У меня есть периодическое прерывистое EXC_BAD_ACCESS задокументированное падение здесь .

Этот вопрос: Какие шаги я могу предпринять, чтобы убедиться, что это не ошибка framework / lib, ина самом деле ошибка с моим кодом?(Помимо очевидного, да, да, это мой код.)

Я борюсь с инструментами и получаю трассировку стека;Есть ли ресурсы, которые я должен использовать, чтобы узнать об этом аспекте программирования?

РЕДАКТИРОВАТЬ: Я думаю, что это трассировка стека:

#0  0x0000cad8 in std::string ofToString<float>(float const&) at /Developer/of_007_iphone/libs/openFrameworks/utils/ofUtils.h:79
#1  0x000064ac in testApp::draw() ()
#2  0x0036d78c in ofAppiPhoneWindow::timerLoop() ()
#3  0x0037e698 in -[ofxiPhoneAppDelegate timerLoop] ()
#4  0x3095cbde in __NSFireTimer ()
#5  0x3579eca0 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
#6  0x3579e6ac in __CFRunLoopDoTimer ()
#7  0x3576e300 in __CFRunLoopRun ()
#8  0x3576dd7a in CFRunLoopRunSpecific ()
#9  0x3576dc88 in CFRunLoopRunInMode ()
#10 0x336ace8c in GSEventRunModal ()
#11 0x318f0f94 in -[UIApplication _run] ()
#12 0x318ee4d4 in UIApplicationMain ()
#13 0x0036e9c4 in ofAppiPhoneWindow::runAppViaInfiniteLoop(ofBaseApp*) ()
#14 0x003a6804 in ofRunApp(ofBaseApp*) ()
#15 0x00002b34 in main ()

ОК, и еще один.Даже не был уверен, что раньше это была отдельная ошибка:

#0  0x00019244 in std::vector<std::complex<float>, std::allocator<std::complex<float> > >::capacity() const at /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/include/c++/4.2.1/bits/stl_vector.h:434
#1  0x00026608 in std::vector<std::complex<float>, std::allocator<std::complex<float> > >::operator=(std::vector<std::complex<float>, std::allocator<std::complex<float> > > const&) at /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/include/c++/4.2.1/bits/vector.tcc:137
#2  0x00018708 in Analyzer::calcFFT() at /Developer/of_007_iphone/apps/cwi007/iTicTacToe/src/gameplay/pitch.cc:86
#3  0x0001881c in Analyzer::process() at /Developer/of_007_iphone/apps/cwi007/iTicTacToe/src/gameplay/pitch.cc:197
#4  0x00004378 in testApp::audioIn(float*, int, int) at /Developer/of_007_iphone/apps/cwi007/iTicTacToe/src/testApp.mm:362
#5  0x004a3fa0 in recordingCallback(void*, unsigned long*, AudioTimeStamp const*, unsigned long, unsigned long, AudioBufferList*) at /Developer/of_007_iphone/libs/openFrameworks/sound/ofxiPhoneSoundStream.mm:143
#6  0x361ccae0 in AUIOHelper::NotifyInputAvailable(AudioTimeStamp const&, unsigned long, AudioBufferList const&) ()
#7  0x361b9b90 in AURemoteIO::PerformIO(unsigned int, unsigned int, XAudioTimeStamp const&, XAudioTimeStamp const&, int&) ()
#8  0x361b9cfc in AURIOCallbackReceiver_PerformIO ()
#9  0x361b0fcc in _XPerformIO ()
#10 0x360dccbc in mshMIGPerform ()
#11 0x36173850 in MSHMIGDispatchMessage ()
#12 0x361c0b5c in AURemoteIO::IOThread::Entry(void*) ()
#13 0x3609ebb4 in CAPThread::Entry(CAPThread*) ()
#14 0x33c14684 in _pthread_start ()

1 Ответ

1 голос
/ 10 сентября 2011

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

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

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

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

...