XCode Instruments没有使用BAD_ACCESS检测Zombie

时间:2011-11-15 19:40:54

标签: objective-c xcode instruments xcode4.2

通常,当我尝试修复BAD_ACCESS错误时,我打开Xcode Instruments并测试以查找导致错误的僵尸。

我正在使用iPhone 5.0模拟器运行我的应用程序。它以BAD_ACCESS停止,但是仪器不会标记任何僵尸。

当我使用iPhone 4.3模拟器运行应用程序时,行为完全不同。在这种情况下,应用程序运行良好,没有任何BAD_ACCESS。

我正在使用XCode 4.2。

可能会发生什么?

这是回溯:

(gdb) bt
#0  0x0167209b in objc_msgSend ()
#1  0x00002ff2 in -[BSViewController viewDidAppear:] (self=0x1, _cmd=0x12ddd81, animated=1 '\001') at BSViewController.m:42
#2  0x012616f8 in __CFStringAppendFormatCore ()
#3  0x011acb6c in _CFStringCreateWithFormatAndArgumentsAux ()
#4  0x0122bce8 in _CFLogvEx ()
#5  0x00b26b63 in NSLogv ()
#6  0x00b26ad5 in NSLog ()
#7  0x00009ffc in -[BSCTView buildFrames] (self=0x6a55f80, _cmd=0xd541) at BSCTView.m:96
#8  0x0000a5da in -[BSCTView layoutSubviews] (self=0x6a55f80, _cmd=0x66a6c4) at BSCTView.m:124
#9  0x001ff301 in -[UIView(CALayerDelegate) layoutSublayersOfLayer:] ()
#10 0x01284e72 in -[NSObject performSelector:withObject:] ()
#11 0x0283592d in -[CALayer layoutSublayers] ()
#12 0x0283f827 in CA::Layer::layout_if_needed ()
#13 0x027c5fa7 in CA::Context::commit_transaction ()
#14 0x027c7ea6 in CA::Transaction::commit ()
#15 0x0285330c in +[CATransaction flush] ()
#16 0x001bf4c6 in -[UIApplication _reportAppLaunchFinished] ()
#17 0x001bfbd6 in -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] ()
#18 0x001ce743 in -[UIApplication handleEvent:withNewEvent:] ()
#19 0x001cf1f8 in -[UIApplication sendEvent:] ()
#20 0x001c2aa9 in _UIApplicationHandleEvent ()
#21 0x01748fa9 in PurpleEventCallback ()
#22 0x012571c5 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#23 0x011bc022 in __CFRunLoopDoSource1 ()
#24 0x011ba90a in __CFRunLoopRun ()
#25 0x011b9db4 in CFRunLoopRunSpecific ()
#26 0x011b9ccb in CFRunLoopRunInMode ()
#27 0x001bf2a7 in -[UIApplication _run] ()
#28 0x001c0a9b in UIApplicationMain ()
#29 0x000027a0 in main (argc=1, argv=0xbffff578) at main.m:16

1 个答案:

答案 0 :(得分:5)

如上所述@AdamRosenfield,在问题评论中,EXC_BAD_ACCESS可能是由许多其他不是僵尸的事情造成的。

在这种特定情况下,问题是NSLog(),格式字符串期望对象@"%@"并且正在接收int作为参数,如下面的示例所示。

int variable = 1;
NSLog(@"%@", variable);

这导致了EXC_BAD_ACCESS

在阅读了回溯后,我看到该行#6并搜索了代码上的所有NSLog()次调用,最终找到了错误的一次。