从模糊堆栈跟踪中查找异常原因
我有一个Android应用程序,最近神秘地强制关闭一些使用4.x设备的用户。看看异常堆栈,好像在我的任何代码运行之前发生错误,但我认为我正在做一些导致此问题的事情。从模糊堆栈跟踪中查找异常原因
* 如何找到我的原因或堆栈有问题?否则,如果这是一个完整的堆栈跟踪是否真的有可能在我的任何代码运行之前Android失败? *
我觉得后者不可能的,因为我登记我在我的Application
的UncaughtExceptionHandler
onCreate()
方法,我通常是从我的用户的文件。
我的错误日志代码如下:
我使用的应用程序的实现扩展Thread.UncaughtExceptionHandler
。发生错误时,我会将例外信息写入uncaughtException(Thread thread,Throwable ex)
的日志中。这是我找到的字符串打印:
// Get exception info
String newLine = "\r\n";
String message = "Message: " + ex.getMessage();
String cause = "Cause: " + ex.getCause();
StackTraceElement[] stes = ex.getStackTrace();
String stack;
// build stack trace
stack = "Stack: " + newLine;
for (int i = 0; i < stes.length; i++)
{
stack += stes[i].toString();
stack += newLine;
}
// print out message
// print out cause
// print out stack
此输出到一个文件:
Message: Unable to create application com.(Modified app name for anonimity).*.*Application: java.lang.IllegalArgumentException Cause: java.lang.IllegalArgumentException Stack: android.app.ActivityThread.handleBindApplication(ActivityThread.java:4254) android.app.ActivityThread.access$1400(ActivityThread.java:140) android.app.ActivityThread$H.handleMessage(ActivityThread.java:1297) android.os.Handler.dispatchMessage(Handler.java:99) android.os.Looper.loop(Looper.java:137) android.app.ActivityThread.main(ActivityThread.java:4921) java.lang.reflect.Method.invokeNative(Native Method) java.lang.reflect.Method.invoke(Method.java:511) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) dalvik.system.NativeStart.main(Native Method)
附: 是的,我知道ACRA,但我现在不想使用它。
也许你的应用程序正在引发一个被捕获然后重新生成的异常。
您只打印上一个异常的Stacktrace。也许这个例外有一个原因(ex.getCause()
不是null
)。在这种情况下,您还应该打印原因的堆栈跟踪(可能是原因的原因..)。
你不必自己做。 Throwable
有这个一个很好的方法,它打印出完整的堆栈跟踪和回溯到PrintStream
:
public void printStackTrace(PrintStream s)
之后,你只需要在printStream
写入日志。
'Throwable.printStackTrace()'创造了奇迹。我没有深入下去。谢谢! – Jon 2013-03-27 22:28:44
@micha仍然是公认的答案,但我想我会根据他的回答显示我的修改方案。
@Override
public void uncaughtException(Thread thread, Throwable ex)
{
// This needs to be AIR TIGHT!. Do everything in a try-catch to prevent
// any exceptions from EVER occurring here. If an error does occur here
// then we will hang
// indefinitely and get an ANR.
try
{
FileManager fileMgr = FileManager.getInstance(myApp);
String logName = "ErrorLog.log";
// print exception to byte array
ByteArrayOutputStream out = new ByteArrayOutputStream();
PrintStream printer = new PrintStream(out);
ex.printStackTrace(printer);
// write out byte array as string to log file.
fileMgr.writeToLogFile(logName, out.toString(), false);
}
catch (Exception e)
{
}
// This allows the system to handle to exception and close the App.
defaultHandler.uncaughtException(thread, ex);
}
我定制FileManager
类完成实际写入文件,但我用Throwable
的printStackTrace()
得到完整的堆栈跟踪,这是更深的话,我会对我自己完成的。
非常感谢 – Sakthimuthiah 2013-06-12 12:46:29
对我来说也是同样的问题。如果你知道解决方案,请帮助我。 – Sakthimuthiah 2013-06-07 13:38:28
@Sakthimuthiah请参阅下面的答案。我根据公认的答案发布了我的最终解决方案。 – Jon 2013-06-07 16:22:26