Кто-нибудь, пожалуйста, помогите понять сбой? - PullRequest
0 голосов
/ 26 февраля 2012

Приложение iPhone падает на устройстве, но не на симуляторе.Поэтому я пытаюсь понять, как интерпретировать журнал сбоев.Я читал много сообщений на форуме, в которых говорилось, что символический журнал сбоев показывает обратную трассировку, которая дает метод и номер строки вызовов, ведущих к сбою, но я не вижу ничего полезного.Может быть, я не смотрю на символический журнал аварий.Вот начало того, что я вижу:

Incident Identifier: 432A8974-1661-409F-B5A6-970148550A46
CrashReporter Key:   db93147c0a70a5f4c60dc92f826e72d5a74477c8
Hardware Model:      iPhone3,3
Process:         Darken [57959]
Path:            /var/mobile/Applications/CB27C10F-CD3B-4148-8321-2C251888B27B/Darken.app/Darken
Identifier:      Darken
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2012-02-25 10:43:47.753 -0500
OS Version:      iPhone OS 4.2.10 (8E600)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000008
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x32716464 objc_msgSend + 16
1   UIKit                           0x3245e6fe -[UIScrollView(UIScrollViewInternal) _scrollViewAnimationEnded] + 90
2   CoreFoundation                  0x32071bb8 -[NSObject(NSObject) performSelector:withObject:] + 16
3   UIKit                           0x3245e5b8 -[UIAnimator stopAnimation:] + 276
4   UIKit                           0x323efbf2 -[UIAnimator(Static) _advance:] + 214
5   UIKit                           0x323efb0e LCDHeartbeatCallback + 10
6   GraphicsServices                0x35474362 HeartbeatVBLCallback + 86
7   IOMobileFramebuffer             0x34739bf4 IOMobileFramebufferVsyncNotifyFunc + 68
8   IOKit                           0x348e5e64 IODispatchCalloutFromCFMessage + 192
9   CoreFoundation                  0x32070be0 __CFMachPortPerform + 204
10  CoreFoundation                  0x320686f8 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 20
11  CoreFoundation                  0x320686bc __CFRunLoopDoSource1 + 160
12  CoreFoundation                  0x3205af76 __CFRunLoopRun + 514
13  CoreFoundation                  0x3205ac80 CFRunLoopRunSpecific + 224
14  CoreFoundation                  0x3205ab88 CFRunLoopRunInMode + 52
15  GraphicsServices                0x354724a4 GSEventRunModal + 108
16  GraphicsServices                0x35472550 GSEventRun + 56
17  UIKit                           0x323c7d1a -[UIApplication _run] + 406
18  UIKit                           0x323c5884 UIApplicationMain + 664
19  Darken                          0x000029d6 0x1000 + 6614
20  Darken                          0x00002998 0x1000 + 6552

... Потоки, отличные от 0, перечисленные здесь

Есть ли здесь что-нибудь полезное для определения, какая строка моего кода привела к сбою?Darken - это название приложения - я это уже знал.Единственное имя метода, которое я узнаю, - это UIApplicationMain, но сбой не произошел при первом запуске приложения - я запускал его около минуты и выполнял десятки функций до сбоя.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2012
  1. Вы не получите номер строки из аварийного дампа (если вы не скомпилировали свое приложение с помощью -g и не запустили в GDB, но я сомневаюсь в этом, поскольку вы, похоже, вообще не знаете, что это такое) .

  2. Вы смотрите символический аварийный дамп: у вас действительно есть имена функций в стеке вызовов. Сбой происходит в последней вызванной (самой верхней) функции, которая является objc_msgSend. Это означает, что вы неправильно сбалансировали свои методы alloc / retain / copy с autorelease / release, и функция мессенджера пытается получить доступ к уже освобожденной / поврежденной / несуществующей памяти, поэтому происходит сбой (EXC_BAD_ACCESS похож на segfault, на самом деле вы ' Я получу один из них, когда сделаешь такую ​​ошибку).

Так что мой совет - трижды проверьте ваш код на наличие вызовов методов, изменяющих счетчик ссылок.

0 голосов
/ 26 февраля 2012

Возможно, вы захотите попробовать установить NSZombieEnabled в YES в вашем проекте и позволить ему аварийно завершить работу, когда ваше устройство работает в режиме отладки. Он должен останавливаться на строке кода, вызывающей ваш сбой. Ваша ошибка выглядит так, как будто это EXC_BAD_ACCESS, что обычно означает, что вы пытались получить доступ к некоторой освобожденной памяти.

...