首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试低内存崩溃(与线程相关?)

调试低内存崩溃(与线程相关?)
EN

Stack Overflow用户
提问于 2013-09-09 10:39:17
回答 1查看 1.6K关注 0票数 1

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

当手机开始内存不足时,我试图从最近的应用列表中重新打开应用程序(在长时间按Home按钮后显示的应用程序),应用程序就会崩溃。

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

代码语言:javascript
复制
I/ActivityManager(  428): Displayed cz.jirkovsky.lukas.chmupocasi/.MainActivity: +1s45ms (total +23m23s835ms)

http://pastebin.com/TtSuqxCW上有完整的logcat,以防我遗漏了什么。

最后,在应用程序崩溃后,当Android的对话框“不幸应用程序停止了”显示时,我尝试将调试器附加到应用程序。我没有看到我的代码在任何线程中运行。以下是“导出线程”所包含的内容:

代码语言:javascript
复制
<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中有一个未处理的异常:

代码语言:javascript
复制
 No such instance field: 'nthreads'

有什么想法,如何调试这样的崩溃,或如何获得更多的信息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-12 18:18:01

我终于找到了解决办法。其实是两个不同的问题。

第一个是我的设备(华为Y300)没有记录任何可以使用logcat检索的堆栈跟踪。这很可能是由我今天早些时候做的重新启动解决的,或者是由于我试图通过android.util.Log使用日志记录一些调试信息这一事实。

第二个是坠机本身。在从崩溃中获得堆栈跟踪之后,这个问题很容易修复。尽管前面使用调试器获得的信息指出了线程的一些问题,但真正的原因是以下异常:

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18696376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档