2014-09-05 5 views
25

MyApp работает хорошо в 98% случаев, но иногда он показывает сбой. И это так случайно.ios crash EXC_BAD_ACCESS KERN_INVALID_ADDRESS

Отчет о сбое показывает следующее.

Thread : Crashed: com.apple.main-thread 
0 libobjc.A.dylib    0x3b1ae626 objc_msgSend + 5 
1 Foundation      0x310e2381 _netServiceMonitorCallBack + 104 
2 CFNetwork      0x302ea3b5 _QueryRecordReply(_DNSServiceRef_t*, unsigned int, unsigned int, int, char const*, unsigned short, unsigned short, unsigned short, void const*, unsigned int, void*) + 324 
3 libsystem_dnssd.dylib   0x3b7289d9 handle_query_response + 168 
4 libsystem_dnssd.dylib   0x3b72773f DNSServiceProcessResult + 582 
5 CFNetwork      0x302ea3e5 _SocketCallBack_Mon(__CFSocket*, unsigned long, __CFData const*, void const*, void*) + 20 
6 CoreFoundation     0x30691189 __CFSocketPerformV0 + 580 
7 CoreFoundation     0x3068efaf __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14 
8 CoreFoundation     0x3068e477 __CFRunLoopDoSources0 + 206 
9 CoreFoundation     0x3068cc67 __CFRunLoopRun + 630 
10 CoreFoundation     0x305f7729 CFRunLoopRunSpecific + 524 
11 CoreFoundation     0x305f750b CFRunLoopRunInMode + 106 
12 GraphicsServices    0x355336d3 GSEventRunModal + 138 
13 UIKit       0x32f58871 UIApplicationMain + 1136 
14 MyApp       0x0013f813 main (main.m:16) 

Все эти взгляды внутренние методы. Я переживаю эти сбои на iPad 4, работающем под iOS 7.1.2. Как я могу прибить его. Все помогает оценить.

+1

Показать в верхней части отчета об аварии, пожалуйста. Особенно код исключения. Это '0xbadfood'? – orkoden

+0

Нет кода исключения 0xf000000c, 0x0000000f. Оба аварий имеют один и тот же стек. –

+0

используйте ExceptionHandler, посмотрите мой ответ здесь: http://stackoverflow.com/questions/10501358/objective-c-getting-line-number-or-full-stack-trace-from-debugger-error/25551171#25551171 –

ответ

20

Этот сбой происходит из-за утечки памяти. Когда какая-либо переменная или объект пытается получить доступ к ограниченной памяти, это происходит.

+5

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

+2

Использование любых блоков? – stevesliva

+1

@stevesliva почему блоки будут проблемой здесь?[Я использую их, и я получаю аналогичную ошибку] ​​ – ripegooseberry

11

Это старый вопрос, но авария EXC_BAD_ACCESS KERN_INVALID_ADDRESS происходит не из-за утечки памяти, а из-за попытки получить доступ к удаленному объекту. Поскольку память освобожденного объекта, возможно, теперь занята другим объектом другого типа, последняя строка в стеке сбоев может быть неверной, поскольку она не является частью вашего запрограммированного пути выполнения, поэтому обычно нам нужно искать трассировку немного. Однако трассировка стека, отправленная @Sj, состоит в основном только из системных вызовов, поэтому это очень сложно. Если это сгенерировано в сеансе отладки, добавление точки останова «Все исключения» может помочь сгенерировать более информативную трассировку стека.

+0

Спасибо за указание. Да, это не из-за утечки памяти. stevesliva добавил комментарий, который помог. Это было из-за блоков, и объект был преждевременно выпущен. Вот почему трассировка стека также не ясна. –

-2

EXC_BAD_ACCESS KERN_INVALID_ADDRESS крах не из-за утечки памяти, , но из-за попытки получить доступ к освобожденному объекту.

Пример: если вы использовали __weak typeof(self) weakSelf = self; и объект был выпущен, прежде чем доступ к ней внутри блока вы получили аварию. Причина - доступ к неправильному адресу памяти, поскольку объект был освобожден.

Для предотвращения использования __strong typeof(self) strongSelf = self; внутри блока. Nil значение будет надлежащим образом без аварии


Примечание: использовать этот образец кода для быстрой работы.

#define weakify(var) __weak typeof(var) AHKWeak_##var = var; 

#define strongify(var) \ 
_Pragma("clang diagnostic push") \ 
_Pragma("clang diagnostic ignored \"-Wshadow\"") \ 
__strong typeof(var) var = AHKWeak_##var; \ 
_Pragma("clang diagnostic pop") 

Пример использования:

weakify(self); // Remove retain cycle 
[self someFunctionWithBlock:^{ 
    strongify(self); // Make reference to address valid 

}]; 
+0

Это неверно; обмен сообщениями с «nil' weakSelf - это как обмен сообщениями с любым другим« nil »в ObjC, это непросто и прекрасно. Вам нужно только «укрепить» слабую ссылку, если вы собираетесь отправлять ей несколько сообщений, чтобы гарантировать, что она не будет освобождена частично. – buildsucceeded

+0

Возможно, я не описал это четко, но вы повторяете мою идею, я согласен с вами. – akaDuality