ios - 解释 iPhone 崩溃日志/堆栈跟踪

标签 ios objective-c debugging

我正在使用 TestFlight SDK并收到了几个与此相同的崩溃报告。但是,我无法理解它,以及报告中崩溃的根本原因是什么?

Exception

SIGSEGV
2 libsystem_c.dylib 0x32862e92 _sigtramp + 42
3 Foundation 0x33750d1c -[NSError dealloc] + 60...

Exception reason

SIGSEGV

Stacktrace

0 MyAppName 0x0013faba testflight_backtrace + 382
1 MyAppName 0x00140708 TFSignalHandler + 264
2 libsystem_c.dylib 0x32862e92 _sigtramp + 42
3 Foundation 0x33750d1c -[NSError dealloc] + 60
4 libobjc.A.dylib 0x39230488 _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 168
5 CoreFoundation 0x31de9440 _CFAutoreleasePoolPop + 16
6 Foundation 0x33751f7a -[NSAutoreleasePool drain] + 122
7 CoreData 0x35e0a4b2 -[NSManagedObjectContext save:] + 1210
8 MyAppName 0x000b7168 MR_swapMethodsFromClass + 18076
9 CoreData 0x35e0dbc0 developerSubmittedBlockToNSManagedObjectContextPerform + 88
10 libdispatch.dylib 0x335974b6 _dispatch_client_callout + 22
11 libdispatch.dylib 0x33598dca _dispatch_main_queue_callback_4CF$VARIANT$up + 226
12 CoreFoundation 0x31e79f3a __CFRunLoopRun + 1290
13 CoreFoundation 0x31decebc CFRunLoopRunSpecific + 356
14 CoreFoundation 0x31decd48 CFRunLoopRunInMode + 104
15 GraphicsServices 0x36e092ea GSEventRunModal + 74
16 UIKit 0x320db2f8 UIApplicationMain + 1120
17 MyAppName 0x00099122 main (main.m:17)
18 MyAppName 0x000990d7 start + 39

其他详细信息:

  • 用户报告此崩溃发生在应用启动后 1-2 秒
  • 该应用使用 Core Data 和 MagicalRecord (这是 MR_swapMethodsFromClass 方法的来源)
  • 从运行各种 iOS 版本(iOS 5.1、6.0、6.1)的 Xcode(iPhone 3GS、iPhone 4 或 iPhone 5)运行时,我无法在任何测试设备上重现此问题

编辑

仍在努力解决这个问题......我已经能够重新创建它(但没有附加调试器)。

这是最奇怪的部分——如果用户使用旧版本的应用程序并安装更新(通过 Test Flight 分发),他们会收到此错误。

但是,如果他们先删除旧应用并安装更新,则不会发生错误。

最佳答案

让我们来看看它:

0 MyAppName 0x0013faba testflight_backtrace + 382
1 MyAppName 0x00140708 TFSignalHandler + 264

那是 TestFlight。这是在崩溃发生之后发生的,所以这肯定不是原因。

2 libsystem_c.dylib 0x32862e92 _sigtramp + 42

这是我们发现崩溃的地方。 “sigtramp”是信号“蹦床”。这是一种奇特的说法,“我捕捉到一个信号(崩溃),现在我要跳转到代码中的其他地方。”

3 Foundation 0x33750d1c -[NSError dealloc] + 60

啊。这个很重要。我们在释放 NSError 时崩溃了。这意味着 NSError 被过度释放或保留不足。

4 libobjc.A.dylib 0x39230488 _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 168
5 CoreFoundation 0x31de9440 _CFAutoreleasePoolPop + 16
6 Foundation 0x33751f7a -[NSAutoreleasePool drain] + 122

可悲……它在耗尽自动释放池时出现。这意味着实际的错误可能离这里还有很长的路要走。但至少我们知道对象的类型。 NSZombies 可用于尝试查找特定对象。

7 CoreData 0x35e0a4b2 -[NSManagedObjectContext save:] + 1210

并且在 MOC 保存期间自动释放池正在耗尽。这表明它可能与您的核心数据代码有关。它至少是您最先看到的地方。

要记住的事情是:

  • 几乎可以肯定该错误存在于您的代码中。
  • 如果它不在您的代码中,它可能在 Magical Record 中
  • 不要假设它在 Core Data 中。鉴于此堆栈,这是最不可能出现错误的地方。

Here's the strangest part-- if a user has an older version of the app and installs an update (distributed via Test Flight), they get this error.

However, if they first delete the old app and install the update, the error doesn't occur.

可能在您的升级代码中。最有可能在核心数据迁移的东西。审核该代码区域中 NSError 的每次使用。消除所有编译器和分析器警告。并尝试 NSZombies,如果它可重现的话。

关于ios - 解释 iPhone 崩溃日志/堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16744385/

相关文章:

objective-c - 如何使用在另一个 View Controller 中输入的值填充 TableView 单元格?

iphone - 为什么我的 iPhone 应用程序无法调用委托(delegate)方法

debugging - 如何在 Jupyter Notebook 中正确退出 ipdb 交互式控制台?

visual-studio - 调试 Classic Asp 时调试器在错误的行上

debugging - 可以从调试器停止并继续执行吗?

ios - 编译错误 : #error "This file should be compiled in ARM mode only."

ios - 使用 GYP 生成 iOS 的 Xcode 项目

播放一次视频后 IOS 电影播放器​​未知加载状态 MPMoviePlayerController

objective-c - 执行 alloc 和 class_createInstance 有什么区别

objective-c - 无法通过协议(protocol)设置值