我正在尝试调试一个神秘的Android应用程序崩溃,它似乎发生在低内存条件下。该应用程序的来源可从https://bitbucket.org/stativ/chmupocasi获得。应用程序的包是cz.jirkovsky.lukas.chmupocasi
当手机开始内存不足时,我试图从最近的应用列表中重新打开应用程序(在长时间按Home按钮后显示的应用程序),应用程序就会崩溃。
我尝试过使用Android调试应用程序,但是应用程序总是在命中主活动的onCreate()和onStart()中的任何断点之前崩溃,因此无法进行调试。更糟糕的是,即使是logcat也不包含任何信息,应用程序崩溃时显示的唯一相关行是:
I/ActivityManager( 428): Displayed cz.jirkovsky.lukas.chmupocasi/.MainActivity: +1s45ms (total +23m23s835ms)http://pastebin.com/TtSuqxCW上有完整的logcat,以防我遗漏了什么。
最后,在应用程序崩溃后,当Android的对话框“不幸应用程序停止了”显示时,我尝试将调试器附加到应用程序。我没有看到我的代码在任何线程中运行。以下是“导出线程”所包含的内容:
<1> main@830017304224, 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> Binder_2@830026133152, prio=5, in group 'main', status: 'RUNNING'
at dalvik.system.NativeStart.run(NativeStart.java:-1)
<9> Binder_1@830026131496, prio=5, in group 'main', status: 'RUNNING'
at dalvik.system.NativeStart.run(NativeStart.java:-1)
<8> FinalizerWatchdogDaemon@830026116408 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> FinalizerDaemon@830026115976 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> ReferenceQueueDaemon@830026115560 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> Compiler@830026115320 daemon, prio=5, in group 'system', status: 'WAIT'
at dalvik.system.NativeStart.run(NativeStart.java:-1)
<3> Signal Catcher@830026114840 daemon, prio=5, in group 'system', status: 'WAIT'
at dalvik.system.NativeStart.run(NativeStart.java:-1)
<2> GC@830026114616 daemon, prio=5, in group 'system', status: 'WAIT'
at dalvik.system.NativeStart.run(NativeStart.java:-1)如果我试图检查主线程,我可以看到ThreadGroup中有一个未处理的异常:
No such instance field: 'nthreads'有什么想法,如何调试这样的崩溃,或如何获得更多的信息?
发布于 2013-09-12 18:18:01
我终于找到了解决办法。其实是两个不同的问题。
第一个是我的设备(华为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告诉我这个片段类可以变成私有包之后,我介绍了这个bug。
https://stackoverflow.com/questions/18696376
复制相似问题