Подтвердить что ты не робот

Недопустимый адрес кучи и фатальный сигнал 11

Каждое так часто мое приложение будет разбиваться, и мой журнал будет читать:

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

Иногда code=2, но всегда Fatal signal 11 и invalid heap address.

Я попытался выяснить, что это значит и как это исправить. Этот поток был наиболее полезным; однако у меня все еще нет решения.

Ошибка возникает, когда я запускаю пару AsyncTasks для загрузки нескольких изображений.

Это мой главный 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);
}

Несмотря на то, что я попытался выяснить, что с этим, я все еще теряюсь, когда дело доходит до его исправления. Если у кого-то есть некоторое понимание, я определенно буду благодарен за это. Ошибка не вызывается каждый раз, когда я execute my AsyncTasks, но я не могу найти много шаблонов, чтобы помочь определить, почему это происходит. Есть несколько других потоков на SO около Fatal signal 11, но они не дают большой помощи в моем случае.

4b9b3361

Ответ 1

Я просто столкнулся с тем же вопросом и получил его в состоянии, который можно переработать. Это ошибка, которую я получал:

08-04 17: 37: 05.491: A/libc (4233): @@@ABORTING: НЕВИДИМЫЙ АДРЕС HEAP В dlfree 08-04 17: 37: 05.491: A/libc (4233): фатальный сигнал 11 (SIGSEGV) при 0xdeadbaad (код = 1)

То, к чему это сводилось, - вызов функции, созданный из двух разных потоков одновременно.

В частности, эта функция была функцией BluetoothSocket close().

Я проверил исходный код на этом веб-сайте, и вызов не синхронизирован (не уверен, что это изменилось с тех пор, как он был от Android 2.1).

Во всяком случае, возможно, у вас есть аналогичный сценарий, когда вызов функции выполняется из нескольких потоков? Не могу сказать точно из исходного кода, который вы показываете.

Также вы пытались не использовать THREAD_POOL_EXECUTOR? В соответствии с руководство разработчика Android:

При первом вводе AsyncTasks выполнялись последовательно на одном фоновом потоке. Начиная с DONUT, это было изменено на пул потоков, позволяющий нескольким задачам работать параллельно. Начиная с HONEYCOMB, задачи выполняются в одном потоке, чтобы избежать общих ошибок приложений, вызванных параллельным выполнением.

Ответ 2

Вчера у меня была такая же ошибка. Это всегда случалось, но не всегда последовательно. То, что вызвало это для меня, до сих пор не упоминалось.

Я думал, что у меня может быть аналогичная проблема, потому что я тоже занимаюсь потоками, однако я удалил все свои потоки, и проблема все еще возникала. Наконец, после множества операторов печати, я смог отследить его до класса, в котором у меня был указатель, который имел указатель как частный член, но я забыл инициализировать указатель.

Позже, когда этот класс уничтожил, он пытался удалить указатель, однако, поскольку указатель не был инициализирован значением NULL, он может иметь или не иметь некоторого значения для мусора, поэтому иногда это не вызывает сбоя и другие времена. Вероятно, потому, что, когда значение мусора было местом памяти, которое не принадлежит мне или когда оно происходит, и я удаляю что-то важное, это приводит к сбою/ошибке.

Здесь приведенный пример проблемы, с которой я столкнулся:

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

Интересно отметить, что этот крах не произошел на моем Transformer Prime, но на моем Nexus4. Просто идет, чтобы показать, что мы должны тестировать на нескольких устройствах! Пока Nexus выигрывает, помогая мне отслеживать ошибки, так как кажется, что это намного более сложный выборщик.