【问题标题】:Mysterious crash happening many times with strange stacktrace奇怪的堆栈跟踪多次发生神秘的崩溃
【发布时间】:2013-08-14 11:38:21
【问题描述】:

我在应用商店上线了这个应用,在 10 天内我遇到了超过 6000 次崩溃!我可以在 HockeyApp 上看到的堆栈跟踪非常神秘,根据 iOS 版本(5 或 6),我还获得了 2 个不同的堆栈跟踪,但我很确定它们都是相同的崩溃。 你怎么看待这件事?我应该在哪里寻找虫子?不用说我无法重现它。

iOS 6

Thread 0 Crashed:
0   libobjc.A.dylib                     0x3ae395d0 _objc_msgSend + 16
1   Foundation                          0x338bc4a1 __NSThreadPerformPerform + 461
2   CoreFoundation                      0x32f798f7 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
3   CoreFoundation                      0x32f791f3 __CFRunLoopDoSources0 + 363
4   CoreFoundation                      0x32f77f2f __CFRunLoopRun + 647
5   CoreFoundation                      0x32eeb23d _CFRunLoopRunSpecific + 357
6   CoreFoundation                      0x32eeb0c9 _CFRunLoopRunInMode + 105
7   GraphicsServices                    0x36aa633b _GSEventRunModal + 75
8   UIKit                               0x34e072b9 _UIApplicationMain + 1121
9   <REDACTED>                        0x00055943 main (main.m:16)

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x736f7477
Crashed Thread:  0

iOS 5:

Thread 0 Crashed:
0   libobjc.A.dylib                     0x338c8f78 _objc_msgSend + 16
1   CoreFoundation                      0x35c091fb -[NSObject performSelector:withObject:] + 43
2   Foundation                          0x350d9747 ___NSThreadPerformPerform + 351
3   CoreFoundation                      0x35c7ead3 ___CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
4   CoreFoundation                      0x35c7e335 ___CFRunLoopDoSources0 + 365
5   CoreFoundation                      0x35c7d045 ___CFRunLoopRun + 653
6   CoreFoundation                      0x35c004a5 _CFRunLoopRunSpecific + 301
7   CoreFoundation                      0x35c0036d _CFRunLoopRunInMode + 105
8   GraphicsServices                    0x3399b439 _GSEventRunModal + 137
9   UIKit                               0x333d8cd5 _UIApplicationMain + 1081
10  <REDACTED>                        0x0003f32b main (main.m:16)

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0xf10d9e21
Crashed Thread:  0

我已经检查了对 performSelector:withObject: 的每个调用,我看不到任何无法识别的选择器被调用。错误在哪里?

更新 ** 还包括来自后台线程的堆栈跟踪

Thread 1:
0   libsystem_kernel.dylib              0x3568a3a8 _kevent + 24
1   libdispatch.dylib                   0x339bdbc9 __dispatch_mgr_wakeup + 1

Thread 2:
0   libsystem_kernel.dylib              0x3569acd4 ___workq_kernreturn + 8

Thread 3:
0   libsystem_kernel.dylib              0x3569acd4 ___workq_kernreturn + 8

Thread 4:
0   libsystem_kernel.dylib              0x3569a0d8 ___psynch_mutexwait + 24
1   WebCore                             0x3721d4ef __ZL17_WebTryThreadLockb + 215
2   WebCore                             0x3721d7f3 __ZL14WebRunLoopLockP19__CFRunLoopObservermPv + 31
3   CoreFoundation                      0x355f8b1b ___CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 19
4   CoreFoundation                      0x355f6d57 ___CFRunLoopDoObservers + 259
5   CoreFoundation                      0x355f701f ___CFRunLoopRun + 615
6   CoreFoundation                      0x3557a4a5 _CFRunLoopRunSpecific + 301
7   CoreFoundation                      0x3557a36d _CFRunLoopRunInMode + 105
8   WebCore                             0x372c0ca3 __ZL12RunWebThreadPv + 403
9   libsystem_c.dylib                   0x34843735 __pthread_start + 321

Thread 5:
0   libsystem_kernel.dylib              0x3569acd4 ___workq_kernreturn + 8

Thread 6:
0   libsystem_kernel.dylib              0x3569acd4 ___workq_kernreturn + 8

Thread 7:
0   libsystem_kernel.dylib              0x3568a004 _mach_msg_trap + 20
1   CoreFoundation                      0x355f83f3 ___CFRunLoopServiceMachPort + 127
2   CoreFoundation                      0x355f712b ___CFRunLoopRun + 883
3   CoreFoundation                      0x3557a4a5 _CFRunLoopRunSpecific + 301
4   CoreFoundation                      0x3557a36d _CFRunLoopRunInMode + 105
5   Foundation                          0x349bfbb9 +[NSURLConnection(Loader) _resourceLoadLoop:] + 309
6   Foundation                          0x349bfa81 -[NSThread main] + 73
7   Foundation                          0x34a53591 ___NSThread__main__ + 1049
8   libsystem_c.dylib                   0x34843735 __pthread_start + 321

Thread 8:
0   libsystem_kernel.dylib              0x3569acd4 ___workq_kernreturn + 8

Thread 9:
0   libsystem_kernel.dylib              0x3569a570 ___select + 20
1   libsystem_c.dylib                   0x34843735 __pthread_start + 321

Thread 10:
0   libsystem_kernel.dylib              0x3569acd4 ___workq_kernreturn + 8

Thread 11:
0   libsystem_kernel.dylib              0x3569acd4 ___workq_kernreturn + 8

Thread 12:
0   libsystem_kernel.dylib              0x3569acd4 ___workq_kernreturn + 8

Thread 13:
0   libsystem_kernel.dylib              0x3569acd4 ___workq_kernreturn + 8

Thread 14:
0   libsystem_kernel.dylib              0x3569acd4 ___workq_kernreturn + 8

Thread 15:
0   libsystem_kernel.dylib              0x3569acd4 ___workq_kernreturn + 8

Thread 16:
0   libsystem_kernel.dylib              0x3569acd4 ___workq_kernreturn + 8

Thread 17:
0   libsystem_kernel.dylib              0x3569acd4 ___workq_kernreturn + 8

Thread 0 crashed with ARM Thread State:
    r0: 0x10910cc0     r1: 0x322194f6     r2: 0x00482a7a     r3: 0x00000000 
    r4: 0xf10a6823     r5: 0x00481a7a     r6: 0x33102823     r7: 0x2fef2e54 
    r8: 0x00482a7a     r9: 0x0c88653d    r10: 0x3efac9b4    r11: 0x00000000 
    ip: 0x004a710c     sp: 0x2fef2e38     lr: 0x00315cf3     pc: 0x33242f78 
  cpsr: 0x20080030 

谢谢

已编辑:感谢 DDPerformDebugger.m,我终于解决了 崩溃是由客户提供的第三方框架引起的。 谢谢大家

【问题讨论】:

标签: ios5 ios6 crash segmentation-fault


【解决方案1】:

您的应用中似乎存在内存和线程问题。应用正在尝试向已释放的对象发送消息(方法)。

两个堆栈跟踪都暗示了线程的使用。看起来您正在后台线程中做一些工作,然后向不再存在的对象(在主线程上?)发送消息。因此,检查后台线程的堆栈跟踪并查看它们在做什么可能会有所帮助。

【讨论】:

  • 我在后台线程中做了很多工作...我编辑了问题以包括来自它们的堆栈跟踪,但它们并没有真正的帮助...仍然我不能重现崩溃,即使我会,我也不知道原因:(
  • 您是否从任何后台线程调用主线程并在主线程上的某个对象上调用某些方法?
  • 当然我从后台线程调用主线程...代码库是 75 KLOC.. 我刚刚在来自dribin.org/dave/blog/archives/2010/03/19/… 的项目中包含了 DDPerformDebugger.m 以便希望如果崩溃再次出现我会知道在哪里搜索
  • 问题不是你调用的对象不理解选择器,而是对象不存在了。因此,您在某个线程上释放了一个对象,导致它被释放,但后台线程稍后尝试使用该指针向其发送消息。但这失败了,因为该指针无处可去。如果您无法在调试版本中重现此问题,请尝试发布版本。问题出在您的内存管理中。
  • 是的,我知道,但是希望在崩溃之前使用 DDPerformDebugger,我可以看到谁调用了 performSelector:withObject: 然后尝试修复它。不幸的是,我们这里的 QA 人员无法重现该问题:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多