2017-10-02 15 views
4

PJSIP v2.3.0을 사용하는 iOS VOIP 앱이 있습니다.PJSIP : iOS 앱을 백그라운드로 이동 한 다음 foreground로 이동할 때 pj_sockaddr_get_port에서 오류가 발생합니다.

iOS 11 출시 이후, 나는 아래에서 많은 충돌 사례를보고 있습니다. 내 응용 프로그램과 통합 된 패브릭 (crashlytics) 있고이 추락 스레드의 backtrace입니다.

PJ_ASSERT_RETURN(a->addr.sa_family == PJ_AF_INET || 
      a->addr.sa_family == PJ_AF_INET6, (pj_uint16_t)0xFFFF); 

pj_sockaddr_get_port

에 의한 주장에

Crashed: Thread 
0 libsystem_kernel.dylib   0x186819348 __pthread_kill + 8 
1 libsystem_pthread.dylib  0x18692d354 pthread_kill$VARIANT$mp + 396 
2 libsystem_c.dylib    0x186788fd8 abort + 140 
3 libsystem_c.dylib    0x18675cabc basename_r + 314 
4 MyApp       0x101a2ab58 pj_sockaddr_get_port + 10115892 
5 MyApp       0x101a24e28 udp_on_read_complete + 10092036 
6 MyApp       0x1019bba74 ioqueue_dispatch_read_event + 9661008 
7 MyApp       0x1019bd1f0 pj_ioqueue_poll + 9667020 
8 MyApp       0x101a08788 pjsip_endpt_handle_events2 + 9975652 
9 MyApp       0x1019df334 worker_thread + 9806608 
10 MyApp       0x1019cf274 thread_main + 9740880 
11 libsystem_pthread.dylib  0x18692c32c _pthread_body + 308 
12 libsystem_pthread.dylib  0x18692c1f8 _pthread_body + 310 
13 libsystem_pthread.dylib  0x18692ac38 thread_start + 4 

스레드 충돌 주 : PJ_ASSERT_RETURN 단순히 여기 PJ_ASSERT되도록 PJ_ENABLE_EXTRA_CHECK 내 응용 프로그램에 대해 0을 정의한다.

이 충돌까지 이어지는 PJSIP 로그는 흥미로운 것을 알려줍니다. 앱에 배경이 설정되고 등록이 취소됩니다. 몇 분 후 앱이 포 그라운드로 이동하면 등록을 시도합니다.

다음 경고 메시지가 표시되는 동시에 crashlytics가 역 추적으로 위에서 언급 한 크래시를보고했습니다.

2017-09-28 21:00:11 TID=50691 [pjsua] Log Level-1 : 16:00:11.267  ioq_select Error replacing socket: Invalid argument 
2017-09-28 21:00:11 TID=50691 [pjsua] Log Level-1 : 16:00:11.267  udp0x10de7f3a0 Warning: pj_ioqueue_recvfrom: [err 120009] Bad file descriptor 
2017-09-28 21:00:11 TID=50691 [pjsua] Log Level-1 : 16:00:11.267  udp0x10de7f3a0 Warning: pj_ioqueue_recvfrom: [err 120009] Bad file descriptor 
. 
. 
. 
2017-09-28 21:00:18 TID=50691 [pjsua] Log Level-1 : 16:00:15.256  udp0x10de7f3a0 Warning: pj_ioqueue_recvfrom: [err 120057] Socket is not connected 
2017-09-28 21:00:18 TID=50691 [pjsua] Log Level-1 : 16:00:15.256  udp0x10de7f3a0 Warning: pj_ioqueue_recvfrom: [err 120057] Socket is not connected 
2017-09-28 21:00:18 TID=50691 [pjsua] Log Level-1 : 16:00:15.256  udp0x10de7f3a0 Warning: pj_ioqueue_recvfrom: [err 120057] Socket is not connected 
. 
. 
. 
2017-09-28 21:00:18 TID=50691 [pjsua] Log Level-1 : 16:00:18.262 udp0x10de7f3a0 Warning: pj_ioqueue_recvfrom: [err 120038] Socket operation on non-socket 
2017-09-28 21:00:18 TID=50691 [pjsua] Log Level-1 : 16:00:18.262 udp0x10de7f3a0 Warning: pj_ioqueue_recvfrom: [err 120038] Socket operation on non-socket 
2017-09-28 21:00:18 TID=50691 [pjsua] Log Level-1 : 16:00:18.262 udp0x10de7f3a0 Warning: pj_ioqueue_recvfrom: [err 120038] Socket operation on non-socket 

이 경고 메시지 때문에 내가 이해에서 udp_on_read_complete 내부 루프를 회전으로 나타납니다. iOS가 pjsip이 사용하려고하는 소켓을 다시 주장 할 수 있습니까?

아무도이 충돌을 발견하지 못 했습니까? 모든 종류의 포인터/가이드를 환영합니다.

+1

비슷한 문제가 발생했습니다. 이 문제를 해결하는 데 성공 했습니까? – MegaManX

+1

현재 테스트중인 pjsip에서이 문제의 해결 방법이 있습니다. 일단 긍정적 인 결과를 얻으면 수정 사항을 알려 드리겠습니다. 감사합니다. . – adsun

+1

'applicationDidEnterBackground :'와'applicationWillEnterForeground :'를 다루는 방법은 무엇입니까? 코드를 제공해야합니다. –

답변

4

내가 만든 수정 사항은 replace_udp_sock()이 실패 할 때 pjlib/src/pj/ioqueue_common_abs.c의 ioqueue_dispatch_read_event 메소드에서 단순히 리턴하는 것이 었습니다. 오류가 무시되고 잘못된 소켓으로 on_read_complete가 호출 되었기 때문에 충돌이 발생했습니다.

변경 내가 만든 :

rc = replace_udp_sock(h); 
if (rc != PJ_SUCCESS) { 
    PJ_LOG(3, (THIS_FILE, "UDP socket replacement failed with error status %d", rc)); 
    if (has_lock) { 
     pj_ioqueue_unlock_key(h); 
    } 
    return; 
} 

이 당신을 위해 문제를 해결되는지 알려주세요.

+0

하지만 ioqueue_dispatch_read_event 함수는 bool 값을 반환해야합니다. _return_ _PJ_FALSE;을 (를) 사용하셨습니까? _ ?? – FreeGor

+0

PJSIP v2.3.0을 사용합니다. 이 방법은 파일 pjlib/SRC/PJ/ioqueue_common_abs.c에 있고 서명이 있습니다 무효 ioqueue_dispatch_read_event (pj_ioqueue_t * ioqueue, pj_ioqueue_key_t의 * 높이) – adsun

+0

인보이스 그것이 pj_bool_t ioqueue_dispatch_read_event (pj_ioqueue_t * ioqueue, pj_ioqueue_key_t의 * 높이)의 2.7.1. replace_udp_sock() 블록을 무시하기 위해 PJ_IPHONE_OS_HAS_MULTITASKING_SUPPORT를 0으로 설정하는 것이 좋을 것 같습니다. – FreeGor