КОРРУПЦИЯ ПАМЯТИ ПАМЯТИ В ошибках dlmalloc или dlfree и SIGSEGV в Android ICS 4.0
Так как я не мог найти кого-либо, сообщившего об этом, прежде чем я подумал о публикации проблемы и моем решении, чтобы она помогла другим, у кого эта проблема. Наше приложение отлично работало на устройствах до ICS. Мы протестировали наше приложение на Galaxy Nexus и эмулятор ICS и увидели странные сбои процесса следующего вида:
КОРРУПЦИЯ ПАМЯТИ ПАМЯТИ В dlmalloc
КОРРУПЦИЯ ПАМЯТИ ПАМЯТИ В dlfree
сигнал 11 (SIGSEGV), ошибка addr deadbaad
Проблема заключается в том, что сбой произошел в родном пространстве, поэтому не было собственного кода, который напрямую повлиял на него. Поскольку мы обрабатываем много изображений в списках, и система выделяет растровые изображения для тех, на что приходило в голову, была некоторая плохая обработка растровых изображений. Мы следовали всем лучшим практикам в Интернете, и мы даже помогли GC собрать ненужные ресурсы, позвонив bitmap.recycle()
. Во всяком случае, по какой-то неизвестной причине приложение постоянно разбилось на Android ICS 4.0.
Ответы
Ответ 1
После некоторого расследования я удалил вызов recycle()
, и теперь все отлично. Кажется, что сборщик мусора в ICS уже правильно очищает растровые изображения. Наш вызов recycle()
заставил систему попытаться освободить память в исходном пространстве, но система уже очистила память. Как-то возник плохой доступ к памяти, и система разбилась. Поэтому, если вы программируете для Android ICS 4.0, и вы испытываете эти проблемы, вы можете попробовать, не перерабатывая свои растровые изображения явно.
Ответ 2
Если вы скомпилируете свое приложение против ICS, нет необходимости явно переписывать, так как это вызовет ошибку 11 (SIGSEGV).