如何调查和修复libpjsua2.so崩溃

use*_*512 5 c++ pjsip android-ndk

SIGSEGV SEGV_MAPERR at 0x00000008

0  libpjsua2.so                   0x56585a88 pj::Call::getInfo() const
1  libpjsua2.so                   0x56546b44 std::allocator<pj::CallMediaInfo>::allocator()
Run Code Online (Sandbox Code Playgroud)

我正在使用pjsip作为我的一个爱好项目(符合GPL).在上方,您可以看到从crashlytics收到的堆栈跟踪.我正在为pjsip使用Java包装器.

有很多用户(50%)受此错误的影响,但是我无法在本地设备上重现它.

不确定,但我怀疑以下java调用导致错误.哪个通过JNI调用C++

public void notifyCallState(MyCall call) {
    if (currentCall == null || call.getId() != currentCall.getId())
        return;

    CallInfo ci;
    try {
        ci = call.getInfo();
    } catch (Exception e) {
        ci = null;
    }
    Message m = Message.obtain(handler, MSG_TYPE.CALL_STATE, ci);
    m.sendToTarget();

    if (ci != null && ci.getState() == pjsip_inv_state.PJSIP_INV_STATE_DISCONNECTED) {
        currentCall = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

代码片段来自psjua下载的示例.链接到http repo.我的代码是一样的.任何帮助高度赞赏

dom*_*men 2

从堆栈跟踪看起来像是callnull,并且getId方法位于 0x8 偏移处。

如果确实如此,修复方法是确保notifyCallState不使用null参数调用,或者在方法内部检查它,即:

if (call == null || currentCall == null || call.getId() != currentCall.getId())
    return;
Run Code Online (Sandbox Code Playgroud)