2015-06-19 91 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平臺沒有動態工具,因此您可能必須使用庫的某些版本(調試/附加日誌記錄)。

我希望以上信息可能會有用,並會給出一些指導方針來解決您的問題。