2013-10-29 73 views
2

調用它的功能時,在Android上墜毀我跟着PJSIP「上手」的文件和內置的Android 9 PJSIP庫成功。但是,當我在我的Android項目中使用它(儘管JNI調用),它通常當我註冊用戶啜切斷或撥打電話out.I創建與API,如pjsua_create和pjsua_init主線程pjsua模塊崩潰,然後我打電話pjsua_acc_add或pjsua_call_make_call在另一個線程,它通常crash.However,它墜毀在一點非常random.Besides,有些時候它不會崩潰,但它未能對pjsip_resolve function.It使SIP消息的目的地IP和端口信息,像「192.168.0.1:5060」,在沒有IP信息,像「字符串:5060'.And我已經PJ線程檢查呢,所以它不會崩潰的that.Anybody遇到這個問題了嗎?我通過google和trac.pjsip.org進行了搜索,但無法獲得任何有用的信息。PJSIP在多線程

任何幫助將不勝感激!

********** Crash dump: ********** 
Build fingerprint: 'Xiaomi/aries/aries:4.1.1/JRO03L/JLB22.0:user/release-keys' 
pid: 3927, tid: 4082, name: Thread-1052 >>> com.ailiao.vp <<< 
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000017 
Stack frame #00 pc 0013c124 /data/data/com.ailiao.vp/lib/libsua.so: Routine ioqueue_on_accept_complete in ../src/pj/activesock.c:916 
Stack frame #01 pc 0013c3e4 /data/data/com.ailiao.vp/lib/libsua.so (pj_hash_get_lower+76): Routine pj_array_erase in ../src/pj/array.c:46 
Crash dump is completed 

********** Crash dump: ********** 
Build fingerprint: 'Xiaomi/aries/aries:4.1.1/JRO03L/JLB22.0:user/release-keys' 
pid: 4387, tid: 4415, name: Thread-1051 >>> com.ailiao.vp <<< 
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000f09 
Stack frame #00 pc 0013c124/data/data/com.ailiao.vp/lib/libsua.so: Routine ioqueue_on_accept_complete in ../src/pj/activesock.c:916 
Stack frame #01 pc 0013c3e4 /data/data/com.ailiao.vp/lib/libsua.so (pj_hash_get_lower+76): Routine pj_array_erase in ../src/pj/array.c:46 
Crash dump is completed 

********** Crash dump: ********** 
Build fingerprint: 'Xiaomi/aries/aries:4.1.1/JRO03L/JLB22.0:user/release-keys' 
pid: 4532, tid: 4613, name: Thread-1060 >>> com.ailiao.vp <<< 
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000038 
Stack frame #00 pc 0013c124 /data/data/com.ailiao.vp/lib/libsua.so: Routine ioqueue_on_accept_complete in ../src/pj/activesock.c:916 
Stack frame #01 pc 0013c468 /data/data/com.ailiao.vp/lib/libsua.so: Routine pj_array_find in ../src/pj/array.c:60 
Crash dump is completed 

********** Crash dump: ********** 
Build fingerprint: 'Xiaomi/aries/aries:4.1.1/JRO03L/JLB22.0:user/release-keys' 
pid: 6317, tid: 6572, name: Thread-1115 >>> com.ailiao.vp <<< 
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr e92d4808 
Stack frame #00 pc 0013f484 /data/data/com.ailiao.vp/lib/libsua.so: Routine pj_list_insert_nodes_before in ../include/pj/list_i.h:54 
Stack frame #01 pc 0013f744 /data/data/com.ailiao.vp/lib/libsua.so (pj_hash_get_lower+76): Routine pj_list_init in ../include/pj/list.h:90 
Stack frame #02 pc 0008e80c /data/data/com.ailiao.vp/lib/libsua.so (pjsip_ua_register_dlg+360): Routine pjsip_ua_destroy in ../src/pjsip/sip_ua_layer.c:230 
Stack frame #03 pc 0008934c /data/data/com.ailiao.vp/lib/libsua.so (pjsip_dlg_create_uac+1880): Routine pjsip_dlg_create_uac in ../src/pjsip/sip_dialog.c:240 
Stack frame #04 pc 00032f50 /data/data/com.ailiao.vp/lib/libsua.so (pjsua_call_make_call+1152): Routine on_make_call_med_tp_complete in ../src/pjsua-lib/pjsua_call.c:459 
Stack frame #05 pc 00026038 /data/data/com.ailiao.vp/lib/libsua.so (Java_sua_Pjsua_makeCall+728): Routine Java_sua_Pjsua_InnerInit in jni/../src/pjsuawrapper.cc:767 
Stack frame #06 pc 0001fb70 /system/lib/libdvm.so (dvmPlatformInvoke+112) 
Stack frame #07 pc 0004e8b9 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+360) 
Stack frame #08 pc 00050603 /system/lib/libdvm.so (dvmResolveNativeMethod(unsigned int const*, JValue*, Method const*, Thread*)+174) 
Stack frame #09 pc 00029020 /system/lib/libdvm.so 
Stack frame #10 pc 0002d7e8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+180) 
Stack frame #11 pc 0005fed5 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272) 
Stack frame #12 pc 0005feff /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+20) 
Stack frame #13 pc 00055327 /system/lib/libdvm.so 
Stack frame #14 pc 00012e70 /system/lib/libc.so (__thread_entry+48) 
Stack frame #15 pc 000125c8 /system/lib/libc.so (pthread_create+172) 
Stack frame #16 pc ffffffff <unknown>: Unable to open symbol file obj\local\armeabi-v7a/<unknown>. Error (123): Unknown error 
Crash dump is completed 

********** Crash dump: ********** 
Build fingerprint: 'Xiaomi/aries/aries:4.1.1/JRO03L/JLB22.0:user/release-keys' 
pid: 7766, tid: 8023, name: Thread-1123 >>> com.ailiao.vp <<< 
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 20e7a813 
Stack frame #00 pc 00014682 /system/lib/libc.so (dlmalloc+1589) 
Stack frame #01 pc 00016fef /system/lib/libc.so (malloc+10) 
Stack frame #02 pc 0014a728 /data/data/com.ailiao.vp/lib/libsua.so: Routine default_block_alloc in ../src/pj/pool_policy_malloc.c:46 

回答

1

NDK_DEBUG=1構建,你會得到一個更詳細的堆棧跟蹤。

: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
I: Build fingerprint: 'asus/WW_Z00T/ASUS_Z00T:5.0.2/LRX22G/WW_user_1.17.40.1234_20160304:user/release-keys' 
I: Revision: '0' 
I: ABI: 'arm64' 
I: pid: 5618, tid: 5924, name: OutgoingCall-si >>> com.siptest.android <<< 
I: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- 
I: Abort message: '../src/pjsip/sip_ua_layer.c:290: pjsip_ua_register_dlg: assertion "dlg->local.info && dlg->local.info->tag.slen && dlg->local.tag_hval != 0" failed' 
I:  x0 0000000000000000 x1 0000000000001724 x2 0000000000000006 x3 000000558de365b0 
I:  x4 000000558de365b0 x5 0000000000000005 x6 0000000000000001 x7 0000000000000020 
I:  x8 0000000000000083 x9 fefefefeff63646b x10 7f7f7f7f7f7f7f7f x11 0000000000000001 
I:  x12 0000000000000001 x13 0000000000000000 x14 0000000000000000 x15 002dee82e7a00ada 
I:  x16 0000007f7d43e483 x17 0000000000000001 x18 0000000000000000 x19 000000558de365b0 
I:  x20 0000007f7d43fbb0 x21 0000007fa017a000 x22 0000000000000058 x23 0000000000000006 
I:  x24 00000000130e4360 x25 00000000130785a0 x26 000000558dd88930 x27 00000000130e4a20 
I:  x28 00000000130785a0 x29 0000007f7d43e720 x30 0000007fa00f48bc 
I:  sp 0000007f7d43e720 pc 0000007fa0139de8 pstate 0000000060000000 
I:  #00 pc 000000000005ede8 /system/lib64/libc.so (tgkill+8) 
I:  #01 pc 00000000000198b8 /system/lib64/libc.so (pthread_kill+160) 
I:  #02 pc 000000000001ae18 /system/lib64/libc.so (raise+28) 
I:  #03 pc 000000000001467c /system/lib64/libc.so (abort+60) 
I:  #04 pc 0000000000016ca8 /system/lib64/libc.so (__libc_fatal+128) 
I:  #05 pc 0000000000014754 /system/lib64/libc.so (__assert2+40) 
I:  #06 pc 00000000001d5ddc /data/app/com.siptest.android-2/lib/arm64/libpjsua2.so (pjsip_ua_register_dlg+248) 
I:  #07 pc 00000000001d1588 /data/app/com.siptest.android-2/lib/arm64/libpjsua2.so (pjsip_dlg_create_uac+1688) 
I:  #08 pc 00000000001634a8 /data/app/com.siptest.android-2/lib/arm64/libpjsua2.so (pjsua_call_make_call+1088) 
I:  #09 pc 0000000000145ce0 /data/app/com.siptest.android-2/lib/arm64/libpjsua2.so (pj::Call::makeCall(std::string const&, pj::CallOpParam const&)+168) 
I:  #10 pc 00000000000fd1f8 /data/app/com.siptest.android-2/lib/arm64/libpjsua2.so (Java_org_pjsip_pjsua2_pjsua2JNI_Call_1makeCall+256) 
I:  #11 pc 000000000075b9d4 /data/dalvik-cache/arm64/[email protected]@[email protected]@classes.dex 
W: RecordThread: buffer overflow 

這似乎表明與註冊證書的一個問題:對我來說,碰撞的來源。一挖成C源代碼,並發現以下領域之一是NULL sip_dialog.c:

/* 
* Create an UAC dialog. 
*/ 
PJ_DEF(pj_status_t) pjsip_dlg_create_uac(pjsip_user_agent *ua, 
         const pj_str_t *local_uri, 
         const pj_str_t *local_contact, 
         const pj_str_t *remote_uri, 
         const pj_str_t *target, 
         pjsip_dialog **p_dlg) 
{ 
    pj_status_t status; 
    pj_str_t tmp; 
    pjsip_dialog *dlg; 

    /* Check arguments. */ 
    PJ_ASSERT_RETURN(ua && local_uri && remote_uri && p_dlg, PJ_EINVAL); 

我也看到其他用戶抱怨說,在Android多線程有問題。確保在進行pjsip庫調用之前連接JVM。也許嘗試:

ua_cfg.setThreadCnt(1); 
    ua_cfg.setMainThreadOnly(true); 

然後,你將不得不通過該線程的任何行動。或者,您可以啓用多線程,然後附上這樣的:

static boolean attachJVM() 
    { 
    // ensure after possibly sleeping on take() 
    final Endpoint ep = endpoint(); 
    try { if (!ep.libIsThreadRegistered()) ep.libRegisterThread(Thread.currentThread().getName()); return true; } 
    catch (Exception e) { log().e(e); return false; } 
    } 

我意識到我正在utilitied有我自己的電話,但我認爲這是很好的自我描述(即日誌()是一個日誌文件並且endpoint()返回在init中構建的Endpoing實例)。

0

我有這個庫了很久的一些問題 - 它崩潰。

上很好地抓住了錯誤日誌一些調查後,我已經找到了大部分的庫崩潰的一個常見原因。 在這裏看到我的答案和評論(不知道這裏是否允許複製粘貼): https://stackoverflow.com/a/46111654/6248423

+0

如果是您的答案,您可以從中複製並調整爲該問題。 – paper1111