作者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
1F:推 johnlinvc:左边navigator切到breakpoint,点左下的+号, 03/30 00:00
2F:→ johnlinvc:选exception breakpoint,他应该就会break了 03/30 00:01
4F:→ reon:说真的我看不懂你要干嘛 都知道错误是超过index 加个判断式 03/31 01:33
5F:→ reon:不就OK了吗@@? 03/31 01:34
6F:→ iwayne:r大,其实重点不在那个错误。而是debugger反应的资讯。 03/31 17:09
7F:→ iwayne:感谢j大及k大提供的意见,K大完全说中我要的东西,谢谢。 03/31 17:12
8F:→ iwayne:刚试了K大的方法,实在太棒了。gdb有点出问题发生点。感谢 03/31 18:18
9F:→ popcorny:为什麽不用j大的方法? 不是比较好看吗? 03/31 19:45
10F:→ iwayne:j大的方式是XCode会产生BreakPoint,而且会停在该Exception 04/01 07:17
11F:→ iwayne:产生处。但K大的方式是直接列出整个Call Stack,更完整。 04/01 07:19
12F:→ iwayne:除此之外,利用NSSetUncaughtExceptionHandler函式,可以更 04/01 07:20
13F:→ iwayne:客制化输出要看的资讯,更有弹性。我是j大跟k大混用的^.^ 04/01 07:21
14F:→ Killercat:其实我当初这样写主要目的是,这样客户的exception才能 04/01 12:24
15F:→ Killercat:正确地放在log里面给我看。很多exception开发期看不到呢 04/01 12:25
16F:→ Killercat:这样的话可以从ipad的crash log正确看出问题噢 04/01 12:25
17F:推 YunnnYunnn:推killercat! 04/03 13:52
18F:推 YunnnYunnn:谢谢j,k大!在一个月後大大地帮了我的忙!!! 05/05 04:05