2011-12-08 11 views
12

Ponieważ nie mogłem znaleźć nikogo zgłaszającego to zachowanie, zanim pomyślałem o zamieszczeniu problemu i mojego rozwiązania, aby pomóc innym osobom mającym ten problem. Nasza aplikacja świetnie działała na urządzeniach przed ICS. Przetestowaliśmy naszą aplikację na Galaxy Nexus i emulatora ICS i zobaczyłem dziwne awarie procesowych z następujących rodzajów:KORUPCJA PAMIĘCI HEAP W błędach dlmalloc lub dlfree i SIGSEGV w systemie Android ICS 4.0

pamięci sterty korupcji w dlmalloc

uszkodzenie stosu Pamięć w dlfree

sygnału 11 (SIGSEGV) fault addr deadbaad

Problem polegał na tym, że awarie wystąpiły w natywnej przestrzeni, więc nie było żadnego napisanego przez siebie kodu, który wpłynąłby na to bezpośrednio. Ponieważ obsłużyliśmy wiele obrazów na listach, a system przydziela bitmapy dla tych, którzy przychodzili do głowy, tylko złe zarządzanie bitmapami. Sprawdziliśmy najlepsze praktyki w sieci i pomogliśmy GC zebrać niepotrzebne zasoby, dzwoniąc pod numer bitmap.recycle(). W każdym razie, z jakiegoś nieznanego powodu, aplikacja ciągle ulegała awarii w systemie Android ICS 4.0.

Odpowiedz

23

Po pewnym dochodzeniu usunąłem połączenie pod numer recycle() i wszystko teraz działa świetnie. Wygląda na to, że garbage collector w ICS już poprawnie usuwa bitmapy. Nasze wywołanie do recycle() spowodowało, że system próbował zwolnić pamięć w natywnej przestrzeni, ale pamięć została już wyczyszczona przez system. W jakiś sposób pojawił się zły dostęp do pamięci i system się zawiesił. Jeśli więc programujesz w systemie Android ICS 4.0 i występują problemy, możesz spróbować bez konieczności bezpośredniego recyklingu bitmap.

+1

Co skłoniło cię do usunięcia wywołania do recyklingu()? Jestem ciekawy, ponieważ doświadczam podobnego błędu, ale nie mam żadnych połączeń z Bitmap.recycle(). – JonnyBoy

+0

Miałem ten sam problem i usunięcie wywołania funkcji "recycle()" rzeczywiście wykonało zadanie. – Houssni

+0

Miałem ten sam problem i usunięcie 'Bitmap.recycle()' napraw to. Bez pomocnego logu, naprawdę trudno było znaleźć przyczynę problemu. Dziękuję @MarioB – Rami

0

Jeśli kompilujesz swoją aplikację z ICS, nie ma potrzeby bezpośredniego wywoływania zwrotu, ponieważ spowoduje to błąd sygnału 11 (SIGSEGV).

+7

Cóż, to w zasadzie to, co powiedziałem powyżej oO –

+2

Jeśli piszesz odpowiedź, która kopiuje odpowiedź kogoś innego, spróbuj dodać trochę mięsa do niej, jak link do dokumentacji potwierdzającej afirmację. – Frederic