无效的堆地址和致命信号11

adn*_*eal 42 heap android android-asynctask

我的应用程序经常会崩溃,我的日志会显示为:

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

有时code=2,但总是Fatal signal 11invalid 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);
}
Run Code Online (Sandbox Code Playgroud)

虽然我已经尝试过研究这个问题,但我仍然发现自己在修复它时已经迷失了.如果有人有一些见解,我一定很感激看到它.在没有引发错误,每次我的时间execute我的AsyncTasks,但我不能找到太多的图案,以帮助找出为什么这正在发生.关于SO还有其他几个主题fatal signal 11,但在我的案例中它们没有提供太多帮助.

Iva*_*van 43

我刚刚遇到了同样的问题并且处于可重新生产的状态.这是我得到的错误:

08-04 17:37:05.491:A/libc(4233):@@@ ABORTING:无效的地址在dlfree 08-04 17:37:05.491:A/libc(4233):0xdeadbaad的致命信号11(SIGSEGV) (代码= 1)

它归结为一个函数调用是由两个不同的线程同时进行的.

更具体地说,这个函数是BluetoothSocket的close()方法.

我检查了这个网站的源代码,并且调用未同步(不确定这是否因为它来自Android 2.1而改变).

无论如何,您是否有类似的场景,其中函数调用是从多个线程进行的?无法从您显示的源代码中确切地说出来.

您是否尝试过不使用THREAD_POOL_EXECUTOR?根据android开发指南:

首次引入时,AsyncTasks在单个后台线程上串行执行.从DONUT开始,这被改为一个线程池,允许多个任务并行运行.从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误.


Pol*_*esh 8

我昨天也遇到了同样的错误.它总是发生但并不总是一致的.到目前为止,没有提到导致它的原因.

我以为我可能有类似的问题,因为我也在处理线程,但是我删除了所有的线程,问题仍在发生.最后,在一堆打印语句之后,我能够将它跟踪到一个我有实例的类,它有一个指针作为私有成员,但我忘了初始化指针.

稍后当该类被破坏时它试图删除指针,但是因为指针没有被初始化为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;
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,我的Transformer Prime没有发生这次崩溃,但在我的Nexus4上却没有.只是表明我们应该在多个设备上进行测试!到目前为止,Nexus在帮助我追踪错误方面取得了成功,因为它似乎更加挑剔.