thread exiting with uncaught exception: NO stack trace
我的应用程序导致某个地方的强制关闭,但我的logcat中没有得到一个致命的异常(以及非常有用的)堆栈跟踪,我只收到以下4行:
1 2 3 4 | 06-27 07:08:54.546: D/dalvikvm(14351): GC_FOR_MALLOC freed 9923 objects / 657416 bytes in 21ms 06-27 07:08:54.769: W/dalvikvm(14351): threadid=20: thread exiting with uncaught exception (group=0x4001d7f0) 06-27 07:08:54.796: W/dalvikvm(14351): threadid=21: thread exiting with uncaught exception (group=0x4001d7f0) 06-27 07:08:54.796: I/Process(14351): Sending signal. PID: 14351 SIG: 9 |
这处于调试模式,没有对logcat应用筛选器!
- 是什么导致了这种行为?
- 有没有办法知道是什么导致了这个例外?
更新:感谢@assylias,我已经能够实现:
1 2 3 4 5 6 7 8 9 | final UncaughtExceptionHandler subclass = Thread.currentThread().getUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread paramThread, Throwable paramThrowable) { Log.getStackTraceString(paramThrowable); subclass.uncaughtException(paramThread, paramThrowable); } }); |
它产生了这些附加的行:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 06-27 08:24:47.105: D/dalvikvm(15475): GC_FOR_MALLOC freed 13865 objects / 1435952 bytes in 45ms 06-27 08:24:47.136: I/dalvikvm(15475): threadid=15: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI 06-27 08:24:47.136: I/dalvikvm(15475): method requires 28+20+20=68 bytes, fp is 0x45209338 (56 left) 06-27 08:24:47.140: I/dalvikvm(15475): expanding stack end (0x45209300 to 0x45209000) 06-27 08:24:47.140: I/dalvikvm(15475): Shrank stack (to 0x45209300, curFrame is 0x4520937c) 06-27 08:24:47.159: I/dalvikvm(15475): threadid=16: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI 06-27 08:24:47.159: I/dalvikvm(15475): method requires 28+20+20=68 bytes, fp is 0x4520c338 (56 left) 06-27 08:24:47.167: I/dalvikvm(15475): expanding stack end (0x4520c300 to 0x4520c000) 06-27 08:24:47.167: I/dalvikvm(15475): Shrank stack (to 0x4520c300, curFrame is 0x4520c37c) 06-27 08:24:47.175: I/dalvikvm(15475): threadid=17: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI 06-27 08:24:47.175: I/dalvikvm(15475): method requires 28+20+20=68 bytes, fp is 0x4520f338 (56 left) 06-27 08:24:47.175: I/dalvikvm(15475): expanding stack end (0x4520f300 to 0x4520f000) 06-27 08:24:47.175: I/dalvikvm(15475): Shrank stack (to 0x4520f300, curFrame is 0x4520f37c) |
这当然是更有用的信息,但现在我正在努力解决以下问题:
- 应用程序现在不强制关闭,尽管调用了
subclass.uncaughtException() 。为什么? - 所有这些堆栈溢出的含义是什么?我能做什么?我可怜的安卓测试设备太累了?
- 我怎么知道代码中的哪个部分导致了这种情况?
更新:
现在唯一剩下的问题是如何重新抛出异常?只是做一个
回答我最后一个问题:Eclipse不会让我在没有尝试/抓捕的情况下扔东西,这让我明白我想要的不是一个再扔,而是一个
您可以在应用程序的开头设置默认的未处理异常处理程序,并在其中记录一些数据(下面的例子是使用Java记录器,但很容易转置到Android):
1 2 3 4 5 6 7 8 9 10 11 12 13 | private static void setDefaultUncaughtExceptionHandler() { try { Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { logger.error("Uncaught Exception detected in thread {}", t, e); } }); } catch (SecurityException e) { logger.error("Could not set the Default Uncaught Exception Handler", e); } } |
这会很乏味,但我会单步执行,直到它与调试器断开。然后您可以添加一个更一般的catch
catch(异常E){}
所有异常都是从异常扩展来的,这样可以帮助您进一步诊断您的问题。
还有一个想法,也许你的应用程序正在运行设备内存。由于内存错误导致JVM关闭,JVM可能会在不通知您的情况下杀死您的应用程序。
我知道这很古老,但如果其他人想知道在处理未捕获的异常之后是否正常退出:
1 2 3 4 5 6 7 8 9 | final Thread.UncaughtExceptionHandler androidDefaultUEH = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(final Thread thread, final Throwable ex) { // Handle exception however you want, then: androidDefaultUEH.uncaughtException(thread, ex); } }); |