如何理解XCode 4上的崩溃日志

4
我正在尝试调试我的应用程序崩溃的原因。通过尝试,我意识到有些地方存在泄漏,并且我正在努力找出原因。我知道这一点是因为当我尝试使用这种方法进行调试 在这里 ,它最终会崩溃,似乎内存泄漏在一段时间后变得更加严重。
为了找出原因,我现在在XCode 4上将NSZombieEnabled打开为YES。但我没有看到任何东西。所以现在我转向崩溃日志。以下是崩溃日志:
Thread 7 Crashed:
0   libsystem_kernel.dylib          0x31b71a1c __pthread_kill + 8
1   libsystem_c.dylib               0x35ceb3b4 pthread_kill + 52
2   libsystem_c.dylib               0x35ce3bf8 abort + 72
3   libsystem_c.dylib               0x35d1f024 free + 104
4   ImageIO                         0x32ca35f0 ImageProviderReleaseInfoCallback + 56
5   CoreGraphics                    0x31a05284 image_provider_finalize + 8
6   CoreFoundation                  0x35aad288 _CFRelease + 160
7   CoreFoundation                  0x35aad1ae CFRelease + 82
8   CoreGraphics                    0x319fe150 CGImageProviderRelease + 4
9   CoreGraphics                    0x31a00bac CGImageBlockSetRelease + 44
10  CoreGraphics                    0x31a00b70 img_blocks_destroy + 8
11  CoreGraphics                    0x319fdaae CGSImageDataUnlock + 26
12  libRIP.A.dylib                  0x309eebae ripc_ReleaseImage + 374
13  libRIP.A.dylib                  0x309ecc9c ripc_DrawImage + 536
14  CoreGraphics                    0x319f9284 CGContextDelegateDrawImage + 44
15  CoreGraphics                    0x319f9142 CGContextDrawImage + 250
16  myapp                           0x000c6a28 0x45000 + 530984
17  myapp                           0x000c6d6a 0x45000 + 531818
18  myapp                           0x000c681c 0x45000 + 530460
19  myapp                           0x000c3526 0x45000 + 517414
20  myapp                           0x000c3796 0x45000 + 518038
21  Foundation                      0x33486382 -[NSThread main] + 38
22  Foundation                      0x334f85c6 __NSThread__main__ + 966
23  libsystem_c.dylib               0x35ceb30a _pthread_start + 242
24  libsystem_c.dylib               0x35cecbb4 thread_start + 0

我的问题是:有没有关于如何阅读和理解这个调试日志的提示?也许有一本书或链接可以全面介绍如何进行调试。谢谢。


威利,你找到这个崩溃的原因了吗? - Jason
是的,我试图访问先前已被释放的对象。 - Willy
谢谢,我遇到了同样的崩溃问题,所以我在绘制UIImage时添加了一个retain/release,希望这能帮助解决它。 - Jason
2个回答

7
在这种情况下,
2   libsystem_c.dylib               0x35ce3bf8 abort + 72
3   libsystem_c.dylib               0x35d1f024 free + 104

free函数检测到释放的地址不在堆内存范围内或无效,然后调用abort函数。

"技术笔记TN2239-iOS调试魔法"是一份非常有用的文档。请查看“内存分配器”并使用Malloc *环境,例如NSZombieEnabled。设置断点以中止函数对于获取free参数和跟踪栈也是有用的。


谢谢你的回答!顺便问一下,学习 C 语言调试能否帮助我调试 Objective-C 代码? - Willy
是的,掌握 C 语言调试知识有助于调试 Objective-C 代码。事实上,编译器会将 Objective-C 代码编译为纯 C 代码。Objective-C Runtime 参考文档 - Kazuki Sakamoto

4
那个崩溃日志未被符号化,因此没有在您的应用程序中提供行号和对象名称。有一个过程可以将此信息添加到崩溃日志中,以提供更多信息来帮助调试崩溃。请参见http://developer.apple.com/tools/xcode/symbolizingcrashdumps.html,特别是符号化崩溃转储的部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接