Подтвердить что ты не робот

Ios crash EXC_BAD_ACCESS KERN_INVALID_ADDRESS

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

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

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. Как я могу прибить его. Все помогает оценить.

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

}];