2012-04-25 87 views
2

我有一个项目在XCode 4.3.1编写的弧,所以我不会留下保留计数。 当我在模拟器或设备上运行项目时,它运行良好。如果我在分析器和分配器下运行它,它运行良好。iPhone应用程序中断发布版本不在调试

但是,如果我将项目归档,并分发它特设并加载.ipa文件,应用程序将与控制台消息崩溃:

<Notice>: Quilters_AppP(1812,0x3f85cd98) malloc: *** error for object 0x1109a910: pointer being freed was not allocated 
<Notice>: *** set a breakpoint in malloc_error_break to debug 

我设置断点malloc_error_debug但由于发生错误在发布的版本中,我从来没有看到调试器。

下面是它变得非常奇怪的地方:现在我已经添加了一些NSLog语句,问题将不会重现。

这里是日志:

Exception Type: EXC_CRASH (SIGABRT) 
Exception Codes: 0x00000000, 0x00000000 
Crashed Thread: 0 

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: 
0 libsystem_kernel.dylib   0x34f5432c __pthread_kill + 8 
1 libsystem_c.dylib    0x36e50208 pthread_kill + 48 
2 libsystem_c.dylib    0x36e49298 abort + 88 
3 libsystem_c.dylib    0x36e0437a free + 374 
4 libobjc.A.dylib     0x36583d72 object_dispose + 14 
5 CoreFoundation     0x350b6618 -[NSObject dealloc] + 76 
6 CoreFoundation     0x350b6736 -[__NSArrayI dealloc] + 162 
7 libobjc.A.dylib     0x3658316e _objc_rootRelease + 30 
8 libobjc.A.dylib     0x36584e50 objc_release + 32 
9 libobjc.A.dylib     0x36583ea6 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 218 
10 libobjc.A.dylib     0x36583dc2 _objc_autoreleasePoolPop + 6 
11 CoreFoundation     0x350b0cf8 _CFAutoreleasePoolPop + 12 
12 UIKit       0x3218ee34 _wrapRunLoopWithAutoreleasePoolHandler + 36 
13 CoreFoundation     0x35134b14 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 12 
14 CoreFoundation     0x35132d50 __CFRunLoopDoObservers + 252 
15 CoreFoundation     0x351330aa __CFRunLoopRun + 754 
16 CoreFoundation     0x350b649e CFRunLoopRunSpecific + 294 
17 CoreFoundation     0x350b6366 CFRunLoopRunInMode + 98 
18 GraphicsServices    0x363b2432 GSEventRunModal + 130 
19 UIKit       0x321ace76 UIApplicationMain + 1074 
20 Quilters_AppP     0x0003505c main (main.m:17) 
21 Quilters_AppP     0x00034af4 0x33000 + 6900 

请帮我抓住这个难以捉摸的错误。该应用程序的目标是4.3/armv7。

+2

错误是你在释放自动释放池中的对象。在某个地方,你在对象上使用'autorelease',然后调用'release'。它可能不会在DEBUG上崩溃,因为NSZombies可能已启用或类似。 – MarkPowell 2012-04-25 19:28:50

+0

谢谢马克,但除了Apple在main.m中提供autoreleasepool之外,我不使用发布或自动发布。 - Dan – 2012-04-25 20:20:56

+0

这个项目使用ARC? – MarkPowell 2012-04-25 20:23:59

回答

1

您可以使用Project的Release Build设置(这通常与Debug Build设置完全不同)来设置断点并调试iOS应用程序。只需修改您的Build设置或您的Run/Test Schemes即可。然后清理,构建和设备调试。

+0

感谢hotpaw,但是当我编辑使用调试存档(这是.ipa文件需要)的方案时,该应用程序将不会安装在我的iPhone上。 - Dan – 2012-04-25 20:32:03

+0

做相反的事情,从lldb或gdb运行你的Release Build。 – hotpaw2 2012-04-25 20:35:09

+0

这让我这个:错误:未能启动'/Users/danselig/Library/Developer/Xcode/DerivedData/Quilters_AppP-cjxjnypyjdgyryfuihmreaubguvu/Build/Products/Release-iphoneos/Quilters_AppP.app/Quilters_AppP' - 未能获得任务过程2085 – 2012-04-25 20:46:12

0

看来问题不在应用程序代码中,而是在编译器代码中。该错误必须在ARC预编译器或编译器本身中。

0

这是一个编译器错误;特别是在优化。测试代码未优化,发布代码针对“最快,最小”进行了优化。当我删除发布版本的优化时,问题就消失了。

触发这是一个托管对象上下文访问应用程序代码...这是一个双循环内进行

- (NSArray *) fetchForGroup:(Group *)group 
{ 
    NSArray *array = [group.polygons allObjects]; 
    return array; 
} 

。在内循环中满足条件时,通过“返回”退出该功能。来自此调用的数组是双重释放的。 - 丹

1

我有一个类似的问题。你的双圈完全描述了我的。我有一个嵌套在两个while循环之间的数组。在调试模式下它很好,但是当为了发布而构建时,它与完全相同的错误崩溃。

原来,在Xcode 4.xx中,您可以将-O0添加到文件的编译器标志中,该标志给出了问题(在您的项目设置 - >构建阶段 - >编译源代码下),它将关闭编译器优化只是为了那个单个文件。为我工作就像一个魅力。

Drew

+0

这不是你想要做的事情。仅仅因为它没有打破你的DEBUG构建,并不意味着它不会最终崩溃。你有一个错误,你在释放一个对象。要么移动到ARC或让自己熟悉内存管理(也适用于ARC)。 – 2012-10-11 17:23:15

相关问题