низкоуровневая ошибка iOS из UIAlertView _performPopup - PullRequest
0 голосов
/ 30 ноября 2010

В последнее время я получаю некоторые сбои низкого уровня, и в частности, это трудно определить происхождение / состояние приложения.Кто-нибудь видел это или знает проблему?Спасибо!

Тип исключения: EXC_BAD_ACCESS (SIGSEGV) Коды исключений: KERN_INVALID_ADDRESS в 0x3dcccccd Сбой потока: 0

<code></p>

<p>Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x3dcccccd
Crashed Thread:  0</p>

<p>Thread 0 Crashed:
0   libobjc.A.dylib                 0x000025fa objc_msgSend + 18
1   UIKit                           0x00162d1c -[UIAlertView(Private) _performPopup:] + 12
2   UIKit                           0x001628de -[UIAlertView(Private) _repopup] + 10
3   UIKit                           0x0016d196 -[UIAlertView(Private) _removeAlertWindowOrShowAnOldAlert] + 70
4   UIKit                           0x00162afa -[UIAlertView(Private) _popoutAnimationDidStop:finished:] + 502
5   UIKit                           0x00050ae4 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 184
6   UIKit                           0x000509ee -[UIViewAnimationState animationDidStop:finished:] + 34
7   QuartzCore                      0x0002ee8c run_animation_callbacks(double, void*) + 284
8   QuartzCore                      0x0002ed2c CA::timer_callback(__CFRunLoopTimer*, void*) + 96
9   CoreFoundation                  0x00022d1c CFRunLoopRunSpecific + 2092
10  CoreFoundation                  0x000224da CFRunLoopRunInMode + 42
11  GraphicsServices                0x000030d4 GSEventRunModal + 108
12  GraphicsServices                0x00003180 GSEventRun + 56
13  UIKit                           0x0000342a -[UIApplication _run] + 374
14  UIKit                           0x00001954 UIApplicationMain + 636
15  iPadDrinkHub.1.0.7              0x00002f24 0x1000 + 7972
16  iPadDrinkHub.1.0.7              0x00002ed8 0x1000 + 7896</p>

<p>

1 Ответ

4 голосов
/ 30 ноября 2010

Странные сбои иногда являются признаком повреждения памяти и / или неправильного управления. Я только что нашел и исправил труднодоступную ошибку в одном из моих приложений несколько дней назад. Приложение работало безупречно в течение 6 месяцев на iOS 3.2, но мгновенно зависало на iOS 4.2. Сбой происходил при добавлении основного окна в окно во время запуска applicationDidFinishLaunching. Трассировка стека показала 100% код iOS; там нигде не было ни одной моей функции (кроме applicationDidFinishLaunching). Оказалось, что я переиздавал UIImage в коде, который был вызван ранее, пока загружались представления. (Я ошибочно вызывал релиз на автоматически выпущенном UIImage).

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

(1) Запустите приложение с помощью NSZombieEnabled. Это переменная окружения, которую вы устанавливаете с помощью XCode, которая часто идентифицирует места, где вы можете ссылаться на объекты, которые уже были освобождены (например, как пример избыточного выпуска, который я упоминал ранее). Дополнительные подробности здесь:

http://www.cocoadev.com/index.pl?NSZombieEnabled

(2) Вы можете включить ведение журнала, в котором будут регистрироваться все сообщения, отправленные всем объектам. Журнал записывается в текстовый файл в папке TMP. Если вы изучите файл журнала, приведший к сбою, вы можете получить некоторое представление о том, что происходит прямо перед сбоем. Это на самом деле техника, которую я использовал, чтобы решить мою ошибку. Вы можете либо изменить свой код, чтобы включить / отключить ведение журнала:

instrumentObjcMessageSends(YES);
// Do stuff...
instrumentObjcMessageSends(NO);

Или вы можете вызвать функцию напрямую из отладчика. Например, установите точку останова непосредственно перед сбоем, затем перейдите в консоль отладчика и сделайте следующее:

(gdb) call (void)instrumentObjcMessageSends(YES)

Дополнительные подробности здесь:

http://www.dribin.org/dave/blog/archives/2006/04/22/tracing_objc/

...