2013-03-04 3 views
0

내부 기능이 libdispatch 내부에서 이상하게 작동하고 있으며 몇 시간 동안의 연구가 끝나고 어떤 일이 발생했는지 전혀 알 수 없습니다.iOS 6.1이 적용된 GCD 내부의 SIGABRT

충돌 추적은 다음과 같습니다

Incident Identifier: 7A5CBCD8-28A3-4AC5-937A-D5BA69A64B67 
CrashReporter Key: [TODO] 
Hardware Model:  iPhone5,2 
Process:   Memoir Dev [6973] 
Path:   /Users/USER/Memoir Dev.app/Memoir Dev 
Identifier:  com.veri.memoir-enterprise 
Version:   0.9.191 
Code Type:  ARM 
Parent Process: launchd [1] 

Date/Time:  2013-03-03 20:55:42 +0000 
OS Version:  iPhone OS 6.1.2 (10B146) 
Report Version: 104 

Exception Type: SIGABRT 
Exception Codes: #0 at 0x3ae66350 
Crashed Thread: 1 

Thread 0: 
0 libsystem_kernel.dylib    0x3ae55e30 _mach_msg_trap + 20 
1 CoreFoundation      0x000972bb __CFRunLoopServiceMachPort + 131 
2 CoreFoundation      0x00095fdb __CFRunLoopRun + 819 
3 CoreFoundation      0x32bc823d _CFRunLoopRunSpecific + 357 
4 CoreFoundation      0x32bc80c9 _CFRunLoopRunInMode + 105 
5 GraphicsServices     0x367a633b _GSEventRunModal + 75 
6 UIKit        0x34ae42b9 _UIApplicationMain + 1121 
7 Memoir Dev       0x0002a0d7 main (main.m:20) 

Thread 1 Crashed: 
0 libsystem_kernel.dylib    0x3ae66350 ___pthread_kill + 8 
1 libsystem_c.dylib     0x3ae1936b _abort + 95 
2 libsystem_c.dylib     0x3adb212d _free + 361 
3 libdispatch.dylib     0x000088d1 _dispatch_kevent_register + 169 
4 libdispatch.dylib     0x00007e91 _dispatch_source_kevent_register + 33 
5 libdispatch.dylib     0x00008957 _dispatch_timer_list_update + 27 
6 libdispatch.dylib     0x00006b81 _dispatch_mgr_invoke + 389 
7 libdispatch.dylib     0x00002378 _dispatch_mgr_thread + 36 

Thread 2: 
0 libsystem_kernel.dylib    0x3ae55e30 _mach_msg_trap + 20 

[...] 

우리의 코드와 시나리오에 대한 배경 비트 : 우리는 우리의 서버

  • 받는 데이터를 업로드하기 위해 광범위하게 NSOperations 및 GCD를 사용하고

    • 앱이 백그라운드에서 최대 10 분 내에 업로드 될 때 충돌이 발생합니다.
    • iOS 6.1 (10B143)을 사용하여 feb/9 주변에서 충돌이 발생하기 시작했습니다. 우리가 6.0.2에서 6.1로 업그레이드 한 후 w 일 후에
    • 지금까지는 6.0.1 (10A523)에서 재생산 할 수 있지만, 6.0.1 (10A523)에서는 재생할 수 없습니다.
    • SIGABRT 예외 유형과 관련하여

    iOS 6.1 이상 버전의 GCD에 알려진 문제가 있는지 알고 계신 분도 계시지 만, 'abort'기능을 호출하고 있습니다 (실제로 'dispatch_kevent_register'가 '무료'라고 함).

  • 답변

    2

    프로세스에서 힙 손상으로 인해 중단()됩니다.

    abort()에 도달하는 디스패치 관리자 스레드가 우발적 일 수 있습니다 (역 추적은 새 디스패치 타이머 소스를 비동기 적으로 설치하고 해당 시간에 malloc이 손상을 감지 한 것을 나타냅니다).

    GuardMalloc (XCode 구성표 편집기의 진단 탭 참조)을 사용하여 실행 해 볼 수 있지만 손상이 실제로 발생할 경우 충돌 지점을 제공 할 가능성이 큽니다.

    또는 다양한 malloc 디버그 환경 변수가 범인을 추적하는 데 도움이 될 수 있습니다 (c.f. malloc의 환경 (3)