1

我在 Crashlytics 中为我的 iOS 应用程序获取了一些崩溃日志,我不知道如何解释它们。我已经在我的应用程序中尝试了所有我能想到的方法来创建崩溃,但无法创建会导致如下堆栈跟踪的崩溃:

Thread : Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x397e6b26 objc_msgSend + 5
1  Foundation                     0x2fcc7f8d -[NSError dealloc] + 60
2  libobjc.A.dylib                0x397f6b0b objc_object::sidetable_release(bool) + 174
3  Foundation                     0x2fd241f5 -[NSFilesystemItemRemoveOperation dealloc] + 60
4  libobjc.A.dylib                0x397f6b0b objc_object::sidetable_release(bool) + 174
5  libobjc.A.dylib                0x397e8007 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 358
6  CoreFoundation                 0x2f2de981 _CFAutoreleasePoolPop + 16
7  UIKit                          0x31b1624d _wrapRunLoopWithAutoreleasePoolHandler + 36
8  CoreFoundation                 0x2f3761cd __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
9  CoreFoundation                 0x2f373b71 __CFRunLoopDoObservers + 284
10 CoreFoundation                 0x2f373eb3 __CFRunLoopRun + 730
11 CoreFoundation                 0x2f2dec27 CFRunLoopRunSpecific + 522
12 CoreFoundation                 0x2f2dea0b CFRunLoopRunInMode + 106
13 GraphicsServices               0x34005283 GSEventRunModal + 138
14 UIKit                          0x31b82049 UIApplicationMain + 1136
15 Pocket Linesman                0x000d5a8b main + 17 (main.m:17)

有谁知道我该如何解释这个堆栈跟踪的原因?当我从文件系统中删除我的应用程序中的对象时,似乎发生了一些事情,但我不是 100% 确定。

4

2 回答 2

3

我们可以在 backtrace 中看到_CFAutoreleasePoolPop

这意味着当当前运行循环的自动释放池试图释放标记为自动释放的对象时发生崩溃......

通常,这意味着手动释放了自动释放的对象。
想象一下:

{
    NSObject * o;

    o = [ [ [ NSObject alloc ] init ] autorelease ];

    [ o release ];
}

此处的o对象的保留计数为1,并标记为自动释放,因此自动释放池的当前实例将在release下次耗尽时向其发送消息。

因此,错误的手动调用release不会产生崩溃,因为对象仍在离开。但是该对象随后将被释放,从而使自动释放池具有对已释放对象的引用。

当池耗尽时,它将尝试release向该无效引用发送消息,您的应用程序将崩溃。

于 2014-01-19T09:25:46.323 回答
0

通过内部NSFilesystemItemRemoveOperation被释放,我猜你正在处理NSFileManager's周围有问题的内存管理removeItemAtPath:error:。您是否在代码中的任何位置进行此调用?

于 2014-01-19T09:17:35.970 回答