堆地址和致命信号无效11

每隔一段时间,我的应用程序将崩溃,我的日志将被读取:

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

有时code=2 ,但总是Fatal signal 11invalid heap address

我试图研究这是什么意思,以及如何解决这个问题。 这个线程是最有帮助的 ; 但是,我仍然没有解决scheme。

当我运行几个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); } 

尽pipe我已经尝试过研究这个问题,但是在修复它时我仍然觉得自己迷失了方向。 如果有人有一些见解,我一定会很高兴看到它。 每次execute我的AsyncTasks时都不会抛出这个错误,但是我找不到很多模式来帮助隔离为什么发生这种情况。 关于fatal signal 11 ,还有一些关于fatal signal 11的其他线索,但是在我的情况下它们没有提供太多的帮助。

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

08-04 17:37:05.491 A / libc(4233):@@@ ABORTING:无效地址在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开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。

我昨天也有同样的错误。 它总是发生,但并不总是一致的。 到目前为止还没有提到对我造成的影响。

我以为我可能有类似的问题,因为我也是处理线程,但是我删除了所有的线程,问题仍然在发生。 最后,在一堆打印语句之后,我可以把它追踪到一个我曾经有一个指针作为私有成员的类,但是我忘记了初始化指针。

后来当这个类被破坏,它试图删除指针,但是因为指针没有被初始化为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上。 只是去显示我们应该在多个设备上testing! 到目前为止,Nexus赢得帮助我追踪错误,因为它看起来很挑剔。