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

时间:2015-06-19 15:55:43

标签: c++ android-ndk pjsip

SIGSEGV SEGV_MAPERR at 0x00000008

0  libpjsua2.so                   0x56585a88 pj::Call::getInfo() const
1  libpjsua2.so                   0x56546b44 std::allocator<pj::CallMediaInfo>::allocator()

我正在使用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;
    }
}

代码片段来自psjua下载的示例。 Camera activity returning null android。我的代码是一样的。任何帮助高度赞赏

2 个答案:

答案 0 :(得分:2)

从堆栈跟踪看起来call为空,getId方法为0x8偏移量。

如果确实如此,那么解决方法是确保notifyCallState不会使用null参数调用,或者在方法中检查它,即:

if (call == null || currentCall == null || call.getId() != currentCall.getId())
    return;

答案 1 :(得分:0)

您的程序很可能会遇到某种内存损坏,很可能是堆内存。以下观察指向了这一点。

  1. 我无法在本地设备上重现它。这是内存损坏的常见症状。
  2. stack-trace包含std :: allocator,表示在使用(创建/删除/访问)堆内存时程序已被终止。
  3. <强>建议

    1. 我们应该尝试检查代码逻辑以及该程序是否以正确的方式使用 Interop 服务。我对此并不了解,但看起来您的程序逻辑确实具有JAVA / C ++交互。如果我们很幸运,我们可能会在这里找到明显的东西,我们就完成了。
    2. 如果堆栈跟踪是在其他事情的影响之后,那么我们就会遇到麻烦,我们可能需要采取以下帖子中建议的方法。
    3. Windows平台

      https://stackoverflow.com/a/22074401/2724703

      Linux平台

      https://stackoverflow.com/a/22658693/2724703

      Android平台

      https://stackoverflow.com/a/22663360/2724703

      您可能希望参考上述帖子,以了解如何处理此类问题。根据我的理解,android平台没有动态工具,因此您可能必须使用库的某些版本(调试/附加日志记录)。

      我确实希望以上信息可能有用,并且会给出一些指导来解决您的问题。