1

我正在尝试调试似乎在低内存条件下发生的我的 Android 应用程序的神秘崩溃。相关应用程序的来源可从https://bitbucket.org/stativ/chmupocasi获得。该应用程序的包是cz.jirkovsky.lukas.chmupocasi

发生的情况是,当手机开始内存不足并且我尝试从最近的应用程序列表中重新打开应用程序(长按主页按钮后显示的应用程序)时,应用程序崩溃。

我尝试使用 Android Studio 调试应用程序,但应用程序总是在遇到主 Activity 的 onCreate() 和 onStart() 中的任何断点之前崩溃,从而无法调试。更糟糕的是,即使是 logcat 也不包含任何信息,应用程序崩溃时显示的唯一相关行是:

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

完整的 logcat 可在http://pastebin.com/TtSuqxCW获得,以防我遗漏了什么。

最后,我尝试在应用程序崩溃后将调试器附加到应用程序,此时会显示 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'

任何想法如何调试此类崩溃或如何获取有关它的更多信息?

4

1 回答 1

1

我终于找到了解决方案。这实际上是两个不同的问题。

第一个是我的设备(华为 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都必须是公共类或公共静态内部类

如果不是,它可能会严重咬你。原因是,即使当类是包私有时它似乎工作正常,但当 aFragment在被销毁以在低内存条件下回收一些内存后重新创建时,它会失败。

最后的寓意是你不应该总是听你的 IDE 说什么,因为我在 Android Studio 告诉我这个片段类可以设为包私有之后引入了这个错误。

于 2013-09-12T18:18:01.747 回答