作者iwayne (Wayne)
看板MacDev
標題[問題] XCode Debugger如何顯示錯誤發生檔案行數
時間Thu Mar 29 22:19:37 2012
各位高手好
小弟最近被一個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
→ 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