2012-05-19 21 views
42

Mỗi thường như vậy ứng dụng của tôi sẽ sụp đổ và đăng nhập của tôi sẽ đọc:không hợp lệ địa chỉ đống và tín hiệu gây tử vong 11

@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree 
Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1) 

Đôi khi code=2, nhưng luôn luôn Fatal signal 11invalid heap address.

Tôi đã thử nghiên cứu ý nghĩa của điều này và cách khắc phục. This thread has been the most helpful; tuy nhiên, tôi vẫn không có giải pháp.

Lỗi xảy ra khi tôi chạy một vài số AsyncTasks để tải xuống một số hình ảnh.

Đây là của tôi chính AsyncTask

public class FetchArtistImages extends AsyncTask<Void, Integer, String[]> implements Constants { 

private final WeakReference<Context> contextReference; 

public FetchArtistImages(Context context) { 
    contextReference = new WeakReference<Context>(context); 
} 

@Override 
protected String[] doInBackground(Void... params) { 
    String[] projection = new String[] { 
      Audio.Artists._ID, Audio.Artists.ARTIST 
    }; 
    String sortOrder = Audio.Artists.DEFAULT_SORT_ORDER; 
    Uri uri = Audio.Artists.EXTERNAL_CONTENT_URI; 
    Cursor c = contextReference.get().getContentResolver() 
      .query(uri, projection, null, null, sortOrder); 
    ArrayList<String> artistIds = new ArrayList<String>(); 
    if (c != null) { 
     int count = c.getCount(); 
     if (count > 0) { 
      final int ARTIST_IDX = c.getColumnIndex(Audio.Artists.ARTIST); 
      for (int i = 0; i < count; i++) { 
       c.moveToPosition(i); 
       artistIds.add(c.getString(ARTIST_IDX)); 
      } 
     } 
     c.close(); 
     c = null; 
    } 
    return artistIds.toArray(new String[artistIds.size()]); 
} 

@Override 
protected void onPostExecute(String[] result) { 
    for (int i = 0; i < result.length; i++) { 
      new LastfmGetArtistImages(contextReference.get()).executeOnExecutor(
        AsyncTask.THREAD_POOL_EXECUTOR, result[i]); 
    } 
    super.onPostExecute(result); 
} 

Mặc dù tôi đã cố gắng nghiên cứu những gì với điều này, tôi vẫn thấy mình bị mất khi nói đến sửa chữa nó. Nếu bất cứ ai có một số cái nhìn sâu sắc, tôi chắc chắn sẽ đánh giá cao nhìn thấy nó. Lỗi không được ném mỗi khi tôi execute số AsyncTasks của tôi, nhưng tôi không thể tìm thấy nhiều mẫu để giúp cô lập lý do tại sao điều này xảy ra. Có một vài chủ đề khác về SO khoảng fatal signal 11, nhưng chúng không cung cấp nhiều trợ giúp trong trường hợp của tôi.

+0

Có bất kỳ JNI nào trong đơn đăng ký của bạn không? –

+0

Không, không có. – adneal

+0

Tôi có JNI trong đơn đăng ký của mình và tôi nhận được lỗi này. Bất kỳ đề xuất nào, @JulieinAustin –

Trả lời

43

Tôi vừa gặp phải vấn đề tương tự và đã gặp vấn đề ở trạng thái có thể tái sản xuất. Đây là lỗi tôi đã nhận được:

08-04 17: 37: 05,491: A/libc (4233): @@@ hủy: INVALID CHỈ heap trong dlfree 08-04 17: 37: 05,491: A/libc (4233): Tín hiệu gây tử vong 11 (SIGSEGV) tại 0xdeadbaad (mã = 1)

Những gì nó được gọi là một cuộc gọi hàm được tạo thành từ hai luồng khác nhau cùng một lúc.

Cụ thể hơn, hàm này là phương thức close() của BluetoothSocket.

Tôi đã kiểm tra mã nguồn at this website và cuộc gọi không được đồng bộ hóa (không chắc chắn nếu điều này đã thay đổi vì nó là từ Android 2.1).

Ở mức nào, bạn có thể có trường hợp tương tự trong đó cuộc gọi hàm được tạo từ nhiều chuỗi không? Không thể nói chắc chắn từ mã nguồn bạn đang hiển thị.

Bạn cũng đã thử không sử dụng THREAD_POOL_EXECUTOR? Theo số the android dev guide:

Khi lần đầu tiên được giới thiệu, AsyncTasks được thực hiện serially trên một chuỗi nền đơn. Bắt đầu với DONUT, điều này đã được thay đổi thành một nhóm các luồng cho phép nhiều tác vụ hoạt động song song. Bắt đầu với HONEYCOMB, các tác vụ được thực hiện trên một luồng đơn để tránh các lỗi ứng dụng phổ biến do thực thi song song.

+0

làm thế nào bạn phát hiện ra rằng phương pháp gây ra vấn đề của bạn là phương thức close() của BluetoothSocket? – bonifaz

+0

Tôi đã kiểm tra mã và nhận thấy rằng tôi đã gọi phương thức close() từ hai luồng khác nhau có thể gần như cùng một lúc. – Ivan

+0

Câu trả lời này hoàn toàn chính xác. Tôi đã có cùng một mã lỗi (@@@ NGẮN: LIBC: ARGUMENT LÀ ĐỊA CHỈ KHIẾU NẠI KHÔNG CÓ MẠNH TRONG dlfree addr). Trong trường hợp cụ thể của tôi, tôi có hai luồng khác nhau gọi phương thức PathMeasure.getPosTan. Sau khi tôi thay đổi mã của tôi để đảm bảo rằng điều này sẽ chỉ được gọi bởi một sợi tại một thời điểm, lỗi đã biến mất. – Luis

8

Tôi đã gặp lỗi tương tự này ngày hôm qua. Nó luôn luôn xảy ra nhưng không phải luôn luôn nhất quán. Điều gì gây ra cho tôi cho đến nay vẫn chưa được đề cập đến.

Tôi nghĩ rằng tôi có thể có một vấn đề tương tự vì tôi cũng đã được giao dịch với chủ đề, tuy nhiên tôi loại bỏ tất cả các luồng của tôi và vấn đề vẫn còn xảy ra. Cuối cùng sau một loạt các câu lệnh in, tôi đã có thể theo dõi nó xuống một lớp mà tôi đã tạo ra có một con trỏ như một thành viên riêng tư, nhưng tôi đã quên khởi tạo con trỏ.

Sau đó, khi lớp đó bị phá hủy, cố gắng xóa con trỏ, tuy nhiên vì con trỏ không được khởi tạo thành NULL, nó có thể hoặc không có giá trị rác, vì vậy đôi khi nó sẽ không gây ra sự cố và thời gian khác . Nó có lẽ là vì khi giá trị rác là một vị trí bộ nhớ không thuộc về tôi hoặc khi nó xảy ra và tôi xóa một cái gì đó quan trọng, nó gây ra sự cố/lỗi.

Dưới đây là một tước xuống ví dụ về vấn đề tôi gặp phải:

class BadFoo 
{ 
public: 
    BadFoo() {} // BAD! We didn't initialize the pointer 
    ~BadFoo() { 
     if (myPtr) { 
      delete myPtr; 
     } 
    } 
    // OTHER MEMBER FUNCTIONS HERE 

private: 
    int* myPtr; 
} 

class GoodFoo 
{ 
public: 
    GoodFoo() : myPtr(NULL) {} // GOOD! Can't be garbage value now 
    ~GoodFoo() { 
     if (myPtr) { 
      delete myPtr; 
     } 
    } 
    // OTHER MEMBER FUNCTIONS HERE 

private: 
    int* myPtr; 
} 

Thú vị cần lưu ý, vụ tai nạn này đã không xảy ra trên Transformer Prime của tôi, nhưng đã làm trên Nexus4 tôi. Chỉ cần đi để cho thấy chúng ta nên thử nghiệm trên nhiều thiết bị! Cho đến nay Nexus giành chiến thắng trên giúp tôi theo dõi lỗi vì nó có vẻ là rất nhiều pickier.

+0

Tại sao lại là downvote? Tôi không thấy lý do tại sao đảm bảo con trỏ được khởi tạo là một điều xấu, đặc biệt là khi nó cũng gây ra lỗi trong câu hỏi. – PolyMesh

+0

Câu trả lời của bạn đã giải quyết được vấn đề của tôi. Cảm ơn bạn – user65721