我有一个使用PJSIP v2.3.0的iOS VOIP应用程序。
在iOS 11发布之后,我在下面看到了很多崩溃的实例。我有与我的应用程序集成的结构(crashlytics),这是崩溃的线程的回溯。
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_sockaddr_get_port
上的断言而崩溃PJ_ASSERT_RETURN(a->addr.sa_family == PJ_AF_INET ||
a->addr.sa_family == PJ_AF_INET6, (pj_uint16_t)0xFFFF);
注意:PJ_ENABLE_EXTRA_CHECK为我的应用定义为0,所以PJ_ASSERT_RETURN在这里只是PJ_ASSERT。
导致这次崩溃的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尝试使用的套接字吗?
有没有人碰到过这次车祸?任何类型的指针/指南都是最受欢迎的。
答案 0 :(得分: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;
}
请告诉我这是否能为您解决问题。