我的应用程序经常会崩溃,我的日志会显示为:
@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree
Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)
有时为code=2
,但始终为Fatal signal 11
和invalid heap address
。
我已经尝试过研究这意味着什么,以及如何解决它。 This thread has been the most helpful;但是,我仍然没有解决方案。
当我运行几个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
我的AsyncTasks
时都不会抛出错误,但我找不到太多的模式来帮助确定这种情况发生的原因。关于fatal signal 11
,关于SO还有其他几个主题,但在我的案例中它们没有提供太多帮助。
答案 0 :(得分:43)
我刚遇到同样的问题并且处于可重新生产的状态。这是我得到的错误:
08-04 17:37:05.491:A / libc(4233):@@ @ ABORTING:dlfree中无效的地址 08-04 17:37:05.491:A / libc(4233):0xdeadbaad(代码= 1)的致命信号11(SIGSEGV)
它归结为一个函数调用是由两个不同的线程同时进行的。
更具体地说,这个函数是BluetoothSocket的close()方法。
我检查了源代码at this website,并且调用未同步(不确定是否因为它来自Android 2.1而发生了变化)。
无论如何,您是否有类似的情况,其中函数调用是从多个线程进行的?无法从您显示的源代码中确切地说出来。
您是否尝试过不使用THREAD_POOL_EXECUTOR?根据{{3}}:
首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。
答案 1 :(得分: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;
}
有趣的是,我的Transformer Prime没有发生这次崩溃,但在我的Nexus4上却没有。只是去表明我们应该在多个设备上进行测试!到目前为止,Nexus在帮助我追踪错误方面取得了成功,因为它似乎更加挑剔。