[問題] XCode Debugger如何顯示錯誤發生檔案行數

看板MacDev作者 (Wayne)時間13年前 (2012/03/29 22:19), 編輯推噓4(4014)
留言18則, 6人參與, 最新討論串1/1
各位高手好 小弟最近被一個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

03/30 00:00, , 1F
左邊navigator切到breakpoint,點左下的+號,
03/30 00:00, 1F

03/30 00:01, , 2F
選exception breakpoint,他應該就會break了
03/30 00:01, 2F

03/30 02:37, , 3F
http://tinyurl.com/868rt68 自吹自擂自推一下
03/30 02:37, 3F

03/31 01:33, , 4F
說真的我看不懂你要幹嘛 都知道錯誤是超過index 加個判斷式
03/31 01:33, 4F

03/31 01:34, , 5F
不就OK了嗎@@?
03/31 01:34, 5F

03/31 17:09, , 6F
r大,其實重點不在那個錯誤。而是debugger反應的資訊。
03/31 17:09, 6F

03/31 17:12, , 7F
感謝j大及k大提供的意見,K大完全說中我要的東西,謝謝。
03/31 17:12, 7F

03/31 18:18, , 8F
剛試了K大的方法,實在太棒了。gdb有點出問題發生點。感謝
03/31 18:18, 8F

03/31 19:45, , 9F
為什麼不用j大的方法? 不是比較好看嗎?
03/31 19:45, 9F

04/01 07:17, , 10F
j大的方式是XCode會產生BreakPoint,而且會停在該Exception
04/01 07:17, 10F

04/01 07:19, , 11F
產生處。但K大的方式是直接列出整個Call Stack,更完整。
04/01 07:19, 11F

04/01 07:20, , 12F
除此之外,利用NSSetUncaughtExceptionHandler函式,可以更
04/01 07:20, 12F

04/01 07:21, , 13F
客制化輸出要看的資訊,更有彈性。我是j大跟k大混用的^.^
04/01 07:21, 13F

04/01 12:24, , 14F
其實我當初這樣寫主要目的是,這樣客戶的exception才能
04/01 12:24, 14F

04/01 12:25, , 15F
正確地放在log裡面給我看。很多exception開發期看不到呢
04/01 12:25, 15F

04/01 12:25, , 16F
這樣的話可以從ipad的crash log正確看出問題噢
04/01 12:25, 16F

04/03 13:52, , 17F
推killercat!
04/03 13:52, 17F

05/05 04:05, , 18F
謝謝j,k大!在一個月後大大地幫了我的忙!!!
05/05 04:05, 18F
文章代碼(AID): #1FT6zxQZ (MacDev)
文章代碼(AID): #1FT6zxQZ (MacDev)