2015-06-19 16 views
5
SIGSEGV SEGV_MAPERR at 0x00000008 

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

Tôi đang sử dụng pjsip cho một trong các dự án sở thích của mình (tuân thủ GPL). Ở trên bạn có thể thấy stacktrace nhận được từ crashlytics. Tôi đang sử dụng Java wrapper cho pjsip.Cách điều tra và khắc phục sự cố libpjsua2.so

Có rất nhiều người dùng (50%) bị ảnh hưởng bởi lỗi này, tuy nhiên tôi không thể tạo lại trên thiết bị cục bộ của mình.

Không chắc chắn nhưng tôi nghi ngờ rằng cuộc gọi java sau dẫn đến lỗi. Mà gọi C++ thông qua JNI

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; 
    } 
} 

đoạn mã được lấy từ ví dụ mà đến từ psjua download. Link to http repo. Mã của tôi là như nhau. Bất kỳ trợ giúp nào được đánh giá cao

+0

Vui lòng sửa thẻ từ c sang C++ hoặc bất kỳ ngôn ngữ nào. Nó không phải là C. –

+0

Dấu vết SIGSEGV của bạn là C++. C không có std :: allocator. –

+0

Đã sửa lỗi. Thật vậy pjsua2 được viết trên C++ – user12384512

Trả lời

2

Từ stacktrace trông giống như call là null và phương pháp getId ở mức 0x8.

Nếu đó là thực sự như vậy, việc sửa chữa là để đảm bảo notifyCallState không được gọi với null cãi nhau, hoặc để kiểm tra nó bên trong phương pháp, ví dụ:

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

Nếu 'call' là null, thì vấn đề nằm ngoài mã được đăng. – Lundin

+1

nếu cuộc gọi là null, sau đó NPE sẽ được ném từ mã Java, khi gọi phương thức getId. Nhưng đây là sự cố C, xảy ra khi gọi phương thức JNI – user12384512

+0

Bằng cách nào đó tôi đọc nó như là mã C++, xin lỗi. – domen

0

chương trình của bạn rất có thể đánh một số loại của bộ nhớ tham nhũng và nhiều khả năng bộ nhớ heap. Theo dõi các quan sát hướng tới điều đó.

  1. Tôi không thể tạo lại trên thiết bị cục bộ của mình. Đây là triệu chứng phổ biến của tham nhũng bộ nhớ.
  2. ngăn xếp dấu vết bao gồm std :: allocator cho biết chương trình đã bị chấm dứt trong khi sử dụng (tạo/xóa/truy cập) bộ nhớ heap.

Khuyến nghị

  1. Chúng ta nên cố gắng xem xét logic mã và dù chương trình này sử dụng Interop dịch vụ trong way.I đúng không có nhiều ý tưởng về vấn đề này tuy nhiên có vẻ như chương trình của bạn logic có tương tác JAVA/C++. Nếu chúng ta may mắn, chúng ta có thể nhận được điều gì đó hiển nhiên ở đây và chúng ta đã hoàn thành.
  2. Nếu ngăn xếp dấu vết sau hiệu ứng của một thứ gì đó khác, thì chúng tôi gặp sự cố, chúng tôi có thể phải thực hiện phương pháp tiếp cận được đề xuất trong các bài đăng bên dưới.

Windows Platform

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

Linux Platform

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

nền tảng Android

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

Bạn có thể tham khảo các bài đăng ở trên để biết ý tưởng về cách tiếp cận các vấn đề như vậy.Theo hiểu biết của tôi, nền tảng Android không có công cụ động nên bạn có thể phải sử dụng một số phiên bản (gỡ lỗi/ghi nhật ký bổ sung) của thư viện.

Tôi hy vọng rằng, thông tin trên có thể hữu ích và sẽ đưa ra một số nguyên tắc để tiếp cận vấn đề của bạn.

Các vấn đề liên quan