2015-06-19 93 views
5
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收到的stacktrace。我为pjsip使用Java包装器。如何调查和修复libpjsua2.so崩溃

有很多用户(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下载的例子。 Link to http repo。我的代码是一样的。任何帮助高度赞赏

+0

请将标记从c改为C++或任何其他语言。它不是C. –

+0

您的SIGSEGV跟踪是C++。 C没有std :: allocator。 –

+0

固定。确实pjsua2写在C++ – user12384512

回答

2

从stacktrace看起来像call为空,并且getId方法是在0x8偏移量。

如果这是真正的情况下,解决方法是确保notifyCallState没有调用null参数,或者检查一下里面的方法,即:

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

如果'call'为空,那么问题就在发布的代码之外。 – Lundin

+1

如果调用为null,那么在调用getId方法时,NPE将从Java代码中抛出。但是,这是C崩溃,发生在调用JNI方法时 – user12384512

+0

不知何故,我将它读为C++代码,对不起。 – domen

0

你的程序是最有可能打某种的内存损坏和最有可能的堆内存。以下意见指出了这一点。

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

建议

  1. 我们应该设法检查代码逻辑,该程序是否使用互操作的正确way.I服务没有对​​此但是它看起来像你的程序太多想法逻辑确实有JAVA/C++交互。如果我们很幸运,我们可能会在这里得到明显的结果,我们就完成了
  2. 如果堆栈跟踪是其他事情的后果,那么我们有麻烦了,我们可能不得不采取下面的帖子中建议的方法。

Windows平台

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

Linux平台

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

的Android平台

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

你可能想引用上面的帖子来得到关于如何解决这些问题的想法。根据我的理解,android平台没有动态工具,因此您可能必须使用库的某些版本(调试/附加日志记录)。

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