精華區beta MacDev 關於我們 聯絡資訊
各位高手好 小弟最近被一個Bug搞了快二個星期。 主要是因為 tag *aTag = [tagArray_MCObj objectAtIndex:indexOfLastOpenedTag]; 其中tag是一個Core Data的某個Entity Class,而tagArray_MCObj是NSArray. 重點來了,因為indexOfLastOpenedTag值超出[tagArray_MCObj count]. e.g. [tagArray_MCObj count]為3,但indexOfLastOpenedTag是3,已超出NSArray範圍。 但程式直接當給我看。並且gdb只show下面訊息 *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2]' *** First throw call stack: (0x34ee588f 0x3630c259 0x34e3d23d 0xc3701 0xc50d7 0xc5d17 0xc400f 0xc4135 0x30d9c60d 0x34eb9a33 0x34eb9699 0x34eb826f 0x34e3b4a5 0x34e3b36d 0x36137439 0x31f31e7d 0xbd485 0xbcf4c) terminate called throwing an exception[Switching to process 7171 thread 0x1c03] 而沒有顯示是在哪個.m檔或是第幾行程式.. 除此之外,以下的call stack也看不出問題... (gdb) backtrace #0 0x34cd932c in __pthread_kill () #1 0x36bd520e in pthread_kill () #2 0x36bce29e in abort () #3 0x3089af6a in abort_message () #4 0x3089834c in default_terminate () #5 0x3630c356 in _objc_terminate () #6 0x308983c4 in safe_handler_caller () #7 0x30898450 in std::terminate () #8 0x30899824 in __cxa_rethrow () #9 0x3630c2a8 in objc_exception_rethrow () #10 0x34e3b50c in CFRunLoopRunSpecific () #11 0x34e3b36c in CFRunLoopRunInMode () #12 0x36137438 in GSEventRunModal () #13 0x31f31e7c in UIApplicationMain () #14 0x000bd484 in main (argc=1, argv=0x2feb9b24) at /Users/wayne/Documents/test/main.m:14 如此,實在對Debug造成很大困擾。 也有可能小弟debug工具還不是很會用... >.< 所以,想請教各位高手,是否哪裏可以開啟或設定, 讓debugger顯示出問題的檔案或行數,或是顯示更細一點的Call stack. (因為gdb只show在main.m第14行,但問題不是出在那裏啊 >.<) 謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.170.54.74
johnlinvc:左邊navigator切到breakpoint,點左下的+號, 03/30 00:00
johnlinvc:選exception breakpoint,他應該就會break了 03/30 00:01
Killercat:http://tinyurl.com/868rt68 自吹自擂自推一下 03/30 02:37
reon:說真的我看不懂你要幹嘛 都知道錯誤是超過index 加個判斷式 03/31 01:33
reon:不就OK了嗎@@? 03/31 01:34
iwayne:r大,其實重點不在那個錯誤。而是debugger反應的資訊。 03/31 17:09
iwayne:感謝j大及k大提供的意見,K大完全說中我要的東西,謝謝。 03/31 17:12
iwayne:剛試了K大的方法,實在太棒了。gdb有點出問題發生點。感謝 03/31 18:18
popcorny:為什麼不用j大的方法? 不是比較好看嗎? 03/31 19:45
iwayne:j大的方式是XCode會產生BreakPoint,而且會停在該Exception 04/01 07:17
iwayne:產生處。但K大的方式是直接列出整個Call Stack,更完整。 04/01 07:19
iwayne:除此之外,利用NSSetUncaughtExceptionHandler函式,可以更 04/01 07:20
iwayne:客制化輸出要看的資訊,更有彈性。我是j大跟k大混用的^.^ 04/01 07:21