Приложение iPad падает только при запуске вручную (с трамплина). Подозревается проблема с памятью
Я пытался решить эту проблему в течение 2 дней, и это сводит меня с ума. Когда XCode запускает приложение, оно работает нормально, но если я вручную запускаю приложение из Springboard, оно вылетает. Консоль распечатывает это:
Jan 20 15:26:29 unknown UIKitApplication:com.yourcompany.ThinClient[0x28cf][1119] <Notice>: ThinClient(1119,0x3db0000) malloc: *** error for object 0x643434: incorrect checksum for freed object - object was probably modified after being freed.
Jan 20 15:26:29 unknown UIKitApplication:com.yourcompany.ThinClient[0x28cf][1119] <Notice>: *** set a breakpoint in malloc_error_break to debug
Jan 20 15:26:29 unknown ThinClient[1119] <Error>: ThinClient(1119,0x3db0000) malloc: *** error for object 0x643434: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Стек для потерянного потока (обычно) выглядит следующим образом, хотя иногда он падает в разных местах:
Thread 5 Crashed:
0 libsystem_kernel.dylib 0x33d4da1c __pthread_kill + 8
1 libsystem_c.dylib 0x353523b4 pthread_kill + 52
2 libsystem_c.dylib 0x3534abf8 abort + 72
3 libsystem_c.dylib 0x3535e822 szone_error + 210
4 libsystem_c.dylib 0x3535e920 free_list_checksum_botch + 16
5 libsystem_c.dylib 0x35361722 tiny_malloc_from_free_list + 82
6 libsystem_c.dylib 0x35361e76 szone_malloc_should_clear + 166
7 libsystem_c.dylib 0x35362fd4 szone_malloc + 4
8 libsystem_c.dylib 0x35386230 malloc_zone_malloc + 48
9 libsystem_c.dylib 0x35386c2c malloc + 28
10 ThinClient 0x0000590c -[MySocket readBytes:] (MySocket.m:231)
11 ThinClient 0x00007b7e -[ThinServerTalker onSocket:readCallbackBytesWaiting:] (ThinServerTalker.m:362)
12 ThinClient 0x000057e2 ReadDataCB (MySocket.m:201)
13 CoreFoundation 0x33cca48a __CFSocketDoCallback + 334
14 CoreFoundation 0x33ccb4a2 __CFSocketPerformV0 + 78
15 CoreFoundation 0x33cc5a72 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 6
16 CoreFoundation 0x33cc7758 __CFRunLoopDoSources0 + 376
17 CoreFoundation 0x33cc84e4 __CFRunLoopRun + 224
18 CoreFoundation 0x33c58ebc CFRunLoopRunSpecific + 224
19 CoreFoundation 0x33c9b6d2 CFRunLoopRun + 42
20 ThinClient 0x00005656 -[MySocket _connect] (MySocket.m:160)
21 Foundation 0x33d71382 -[NSThread main] + 38
22 Foundation 0x33de35c6 __NSThread__main__ + 966
23 libsystem_c.dylib 0x3535230a _pthread_start + 242
24 libsystem_c.dylib 0x35353bb4 thread_start + 0
Я подозреваю, что это из записи приложения в память, которая уже была освобождена, поэтому я уже попробовал несколько вещей:
- Я попытался отладить приложение с помощью защитного malloc, каракулей, защитных граней, объектов зомби, стека malloc и т. Д.
- Я попытался перейти к коду, в котором произошло сбой приложения, и найти там проблему (я не верю, что там есть проблема, потому что приложение вылетает в разных местах, но все они находятся рядом друг с другом)
- Я попытался пройти и закомментировать все мои вызовы функций free().
Я до сих пор не нашел проблему! Если бы кто-нибудь мог, пожалуйста, пролить свет на это, это было бы очень ценно! Спасибо! Какие-либо предложения?
Изменить: приложение будет зависать каждый раз, если оно запускается с трамплина, но если Xcode запускает его, оно будет работать нормально.
1 ответ
Я нашел проблему. Я возвращал прямой указатель на байты в объекте NSData из функции. Я просто заменил функцию с именем "-(char*)getBytes" на функцию с именем "-(NSData*)getDataCopy". Вместо этого Get Data Copy возвращает автоматически выпущенную копию класса данных.
Повторить:
У меня было это:
-(char*)getBytes{
return _data.bytes;}
и я заменил это этим
-(NSData*)getDataCopy{
return [NSData dataWithData:_data];
}
Проблема заключалась в том, что я писал в память, которая уже была выпущена.