2013-09-09 2 views
1

Я пытаюсь отлаживать таинственный крах моего приложения для Android, которое, как представляется, происходит в условиях низкой памяти. Источники приложения, о котором идет речь, доступны от https://bitbucket.org/stativ/chmupocasi. Пакет приложения является cz.jirkovsky.lukas.chmupocasiОтладка сбойной памяти (связанные с потоком?)

Что происходит, что, когда телефон начинает иссякать на память, и я пытаюсь снова открыть приложение из списка последних приложений (тот, который показывает после долгого нажатия Home кнопку), приложение аварийно завершает работу.

Я попытался отладить приложение с помощью Android Studio, но приложение всегда сработает, прежде чем ударить любую из точек останова в onCreate() и onStart() основной активности, что делает невозможным отладку. Что еще хуже, что даже LogCat не содержит какой-либо информации, связанной с единственной линией показано, когда приложение выходит из строя является:

I/ActivityManager( 428): Displayed cz.jirkovsky.lukas.chmupocasi/.MainActivity: +1s45ms (total +23m23s835ms) 

Полный LogCat доступен в http://pastebin.com/TtSuqxCW, в случае, если я что-то не хватает.

Наконец, я попытался подключить отладчик к приложению после его сбоя, когда отображается диалоговое окно Android «К сожалению приложение остановлено». Я не вижу, чтобы какой-либо из моих кодов запускался в любом потоке. Вот то, что «Экспорт Нить» содержит:

<1> [email protected], prio=5, in group 'main', status: 'RUNNING' 
    at android.os.BinderProxy.transact(Binder.java:-1) 
    at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:3147) 
    at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:76) 
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) 
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690) 
    at dalvik.system.NativeStart.main(NativeStart.java:-1) 

<10> [email protected], prio=5, in group 'main', status: 'RUNNING' 
    at dalvik.system.NativeStart.run(NativeStart.java:-1) 

<9> [email protected], prio=5, in group 'main', status: 'RUNNING' 
    at dalvik.system.NativeStart.run(NativeStart.java:-1) 

<8> [email protected] daemon, prio=5, in group 'system', status: 'WAIT' 
    at java.lang.Object.wait(Object.java:-1) 
    at java.lang.Object.wait(Object.java:364) 
    at java.lang.Daemons$FinalizerWatchdogDaemon.run(Daemons.java:214) 
    at java.lang.Thread.run(Thread.java:856) 

<7> [email protected] daemon, prio=5, in group 'system', status: 'WAIT' 
    at java.lang.Object.wait(Object.java:-1) 
    at java.lang.Object.wait(Object.java:401) 
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:102) 
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:73) 
    at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:169) 
    at java.lang.Thread.run(Thread.java:856) 

<6> [email protected] daemon, prio=5, in group 'system', status: 'WAIT' 
    at java.lang.Object.wait(Object.java:-1) 
    at java.lang.Object.wait(Object.java:364) 
    at java.lang.Daemons$ReferenceQueueDaemon.run(Daemons.java:129) 
    at java.lang.Thread.run(Thread.java:856) 

<5> [email protected] daemon, prio=5, in group 'system', status: 'WAIT' 
    at dalvik.system.NativeStart.run(NativeStart.java:-1) 

<3> Signal [email protected] daemon, prio=5, in group 'system', status: 'WAIT' 
    at dalvik.system.NativeStart.run(NativeStart.java:-1) 

<2> [email protected] daemon, prio=5, in group 'system', status: 'WAIT' 
    at dalvik.system.NativeStart.run(NativeStart.java:-1) 

Если я пытаюсь изучить основной поток, я могу видеть, что есть необработанное исключение где-то в ThreadGroup:

No such instance field: 'nthreads' 

Любые идеи, как отладить такой крах или как получить дополнительную информацию об этом?

ответ

1

Я наконец нашел решение. На самом деле это были две отдельные проблемы.

Первое, что мое устройство (Huawei Y300) не регистрировало трассировку стека, которая может быть получена с помощью logcat. Вероятно, это было разрешено перезагрузкой, которую я сделал сегодня сегодня, или, что менее вероятно, из-за того, что я пытался использовать регистрацию через android.util.Log для регистрации некоторой информации об отладке.

Вторая авария была сама. После получения трассировки стека от сбоя проблема была довольно легко исправить. Даже при том, что предыдущая информация я получил с помощью отладчика указал на некоторые проблемы с потоками, реальной причиной было следующее исключение:

android.app.Fragment$InstantiationException: Unable to instantiate fragment cz.jirkovsky.lukas.chmupocasi.RetainFragment: make sure class name exists, is public, and has an empty constructor that is public 

Истинная причина в том, что RetainFragment был пакет частных. Однако все классы, наследующие от Fragment, должны быть общедоступными или общедоступными статическими внутренними классами.

Если это не так, это может сильно укусить вас. Причина в том, что, несмотря на то, что кажется, что он отлично работает, когда класс является приватным пакетом, он будет терпеть неудачу, когда восстанавливается Fragment после его уничтожения, чтобы восстановить память в состоянии с низкой памятью.

Мораль в конце состоит в том, что вы не всегда должны слушать то, что говорит ваша IDE, потому что я представил ошибку после того, как Android Studio сообщила мне, что этот класс фрагментов можно сделать закрытым.

Смежные вопросы