【问题标题】:Can't Determine Reason for Crash from Xcode Crash Log无法从 Xcode 崩溃日志中确定崩溃的原因
【发布时间】:2016-01-05 04:30:48
【问题描述】:

我有一个用户在他的 iPhone 5 上运行我的应用程序。他使用 iTunes 执行了备份。买了一部新的 iPhone 6S 并从他的 iTunes 备份中恢复。

当他启动我的应用程序时,它会在启动过程中立即崩溃。我从他那里得到了崩溃日志,但没有错误消息。它在我的 AppDelegate 中自动生成的 -applicationDocumentsDirectory 函数期间崩溃。

- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

我有什么方法可以确定实际出了什么问题,看看我是否可以修复它?

Incident Identifier: 3A0D56CA-EEAF-4F5A-8D16-D182E61034D5
CrashReporter Key:   9f4ce42b70e98d925f135c618394817f9451767b
Hardware Model:      iPhone8,1
Process:             MyApp [1198]
Path:                /private/var/mobile/Containers/Bundle/Application/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX/MyApp.app/MyApp
Identifier:          com.inadaydevelopment.myapp
Version:             1.0.1 (1.0)
Code Type:           ARM-64 (Native)
Parent Process:      launchd [1]

Date/Time:           2015-10-02 14:30:25.25 -0700
Launch Time:         2015-10-02 14:30:25.25 -0700
OS Version:          iOS 9.0.1 (13A405)
Report Version:      105

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  0

Filtered syslog:
None found

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x000000019950b1e0 __pthread_kill + 8
1   libsystem_pthread.dylib         0x00000001995d4f0c pthread_kill + 112
2   libsystem_c.dylib               0x000000019947eb78 abort + 140
3   MyApp                           0x000000010001ef7c -[AppDelegate applicationDocumentsDirectory] (AppDelegate.m:517)
4   MyApp                           0x000000010001eae8 -[AppDelegate managedObjectContext] (AppDelegate.m:430)
5   MyApp                           0x000000010002d004 -[BaseViewController awakeFromNib] (BaseViewController.m:54)
6   UIKit                           0x00000001890e6058 -[UINib instantiateWithOwner:options:] + 2188
7   UIKit                           0x0000000189324ea0 -[UIStoryboard instantiateViewControllerWithIdentifier:] + 196
8   UIKit                           0x0000000189325000 -[UIStoryboard instantiateInitialViewController] + 68
9   UIKit                           0x0000000188edd178 -[UIApplication _loadMainStoryboardFileNamed:bundle:] + 108
10  UIKit                           0x0000000188caee40 -[UIApplication _loadMainInterfaceFile] + 264
11  UIKit                           0x0000000188edc068 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1316
12  UIKit                           0x0000000188ed9300 -[UIApplication workspaceDidEndTransaction:] + 168
13  FrontBoardServices              0x000000018d7737ec -[FBSSerialQueue _performNext] + 184
14  FrontBoardServices              0x000000018d773b6c -[FBSSerialQueue _performNextFromRunLoopSource] + 56
15  CoreFoundation                  0x000000018369c5a4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
16  CoreFoundation                  0x000000018369c038 __CFRunLoopDoSources0 + 540
17  CoreFoundation                  0x0000000183699d38 __CFRunLoopRun + 724
18  CoreFoundation                  0x00000001835c8dc0 CFRunLoopRunSpecific + 384
19  UIKit                           0x0000000188ca80c8 -[UIApplication _run] + 460
20  UIKit                           0x0000000188ca2f60 UIApplicationMain + 204
21  MyApp                           0x000000010001bdd0 main (main.m:16)
22  libdyld.dylib                   0x00000001993ee8b8 start + 4

【问题讨论】:

  • 看起来该应用正在文档目录中寻找一些文件,不幸的是它们不在应用文档目录中!!!
  • 它实际上只是在寻找文档目录本身,但如果这些目录不存在,它应该只返回 nil 并且在 nil 上操作永远不会崩溃。
  • 你能在6S模拟器中重现这个吗?
  • 查看路径/private/var/mobile/Containers/Bundle/Application/XXX....看看有没有文件夹
  • 为什么在调用 BaseViewController 之后调用应用委托?这是预期的吗?

标签: ios objective-c xcode crash-reports


【解决方案1】:

当消息发送到已释放的实例时,经常会发生没有任何有用堆栈跟踪的崩溃。几周前,我在处理 UIViewController 类别时遇到了这个问题。

当然,你是对的,发送给 nil 的消息不会造成任何伤害。另一方面,发送到已解除分配的某事物实例的消息会导致崩溃。
尝试开启 ZombieObjects,当出现这种情况时你会得到一个日志,它可以帮助你找到 bug。

【讨论】:

  • 这不是我可以复制的。它发生在野外,不是我可以重建二进制文件并重试的情况。
  • 这很不幸。尽管如此,对于未来的测试(除非您想实时查看内存使用情况),启用 ZombieObjects 并没有什么坏处。此外,在这种情况下,仪器可以提供帮助。还要留意例如意外成为强参考的代表。祝你好运:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多