Помогите мне диагностировать этот сбой - PullRequest
1 голос
/ 01 мая 2011

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

Exception Type:  EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes: 0x0000000000000001, 0x0000000000000000
Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Application Specific Information:
objc[1535]: FREED(id): message retain sent to freed object=0x640ad0

Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib                     0x9116f4b4 _objc_error + 116
1   libobjc.A.dylib                     0x9116f4ea __objc_error + 52
2   libobjc.A.dylib                     0x9116d7dc _freedHandler + 58
3   ...my_company.my_app      0x00045635 -[MyObject mySelector] + 1494
4   com.apple.Foundation                0x90be18d4 __NSFireTimer + 141
5   com.apple.CoreFoundation            0x93a38adb __CFRunLoopRun + 8059
6   com.apple.CoreFoundation            0x93a36464 CFRunLoopRunSpecific + 452
7   com.apple.CoreFoundation            0x93a36291 CFRunLoopRunInMode + 97
8   com.apple.HIToolbox                 0x92982e04 RunCurrentEventLoopInMode + 392
9   com.apple.HIToolbox                 0x92982bb9 ReceiveNextEventCommon + 354
10  com.apple.HIToolbox                 0x92982a3e BlockUntilNextEventMatchingListInMode     + 81
11  com.apple.AppKit                    0x9576e78d _DPSNextEvent + 847
12  com.apple.AppKit                    0x9576dfce -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 156
13  com.apple.AppKit                    0x95730247 -[NSApplication run] + 821
14  com.apple.AppKit                    0x957282d9 NSApplicationMain + 574
15  ...my_company.my_app      0x00002042 start + 54

Итак, из этой строки:

3   ...my_company.my_app      0x00045635 -[MyObject mySelector] + 1494

Я могу сделать вывод, что в mySelector сообщение отправляется объекту, который уже был освобожден, но я просмотрел код и просто не могу его увидеть, и здесь слишком много других зависимостей, чтобы опубликовать код здесь ,

Итак, мои вопросы:

  1. Что означают числа в конце каждой строки, в приведенном выше примере это 1494.
  2. В предыдущей строке есть ссылка на __NSFireTimer - означает ли это, что mySelector вызывается NSTimer в моем коде?
  3. Я пытался запустить мое приложение с включенными зомби, кроме того, что посыпал мой код проверками, что каждый объект! = Nil в mySelector, что еще я могу сделать, если я не могу повторить сбой?

Любая помощь по этому вопросу будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 09 июня 2011

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

Ссылка на NSFireTimer означает, что цикл выполнения вашего основного потока имеет запланированный таймер и вызвал вызов [myObject mySelector].Я думаю, из трассировки стека мы можем предположить, что таймер вызвал «myObject» напрямую, так как нет других промежуточных кадров стека.

Я думаю, что объект был освобожден, но он был цельюзапланированный таймер в вашем основном потоке, который вы забыли удалить.

То, как объект освободился в первую очередь, зависит от того, как скомпилировано ваше приложение.Использует ли он сборщик мусора или полагается на управление сохранением / освобождением памяти?

Если вы не используете сборщик мусора, то вы, вероятно, пропустили «сохранение» где-то.Возможно, ваш объект был автоматически освобожден, и runloop очистил его, когда вы этого не ожидали?

Если вы можете идентифицировать задействованный таймер, вы можете подумать об отключении таймера в методе dealloc или finalize.вашего класса.Вы также можете добавить туда логирование, чтобы показать вам, когда объект освобожден.

0 голосов
/ 01 мая 2011

Используйте инструменты для просмотра распределения.Я нашел это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...