Java 从模糊堆栈跟踪中查找异常原因

Java 从模糊堆栈跟踪中查找异常原因,java,android,exception,exception-handling,Java,Android,Exception,Exception Handling,我有一个Android应用程序,最近它神秘地强迫我的一些使用4.x设备的用户关闭。查看异常堆栈,错误似乎发生在我的任何代码运行之前,但我假设我正在执行导致此错误的操作 *我如何找到原因或堆栈有问题吗?否则,如果这是一个完整的堆栈跟踪,那么Android真的有可能在我的任何代码运行之前失败吗* 我发现后者不太可能,因为我在我的应用程序的onCreate()方法中注册了我的UncaughtExceptionHandler,并且我通常从用户那里获取一个文件 我的错误记录代码如下: 我使用应用程序的。当

我有一个Android应用程序,最近它神秘地强迫我的一些使用4.x设备的用户关闭。查看异常堆栈,错误似乎发生在我的任何代码运行之前,但我假设我正在执行导致此错误的操作

*我如何找到原因或堆栈有问题吗?否则,如果这是一个完整的堆栈跟踪,那么Android真的有可能在我的任何代码运行之前失败吗*

我发现后者不太可能,因为我在我的
应用程序
onCreate()
方法中注册了我的
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
//获取异常信息
字符串换行符=“\r\n”;
String message=“message:+ex.getMessage();
字符串cause=“cause:+ex.getCause();
StackTraceElement[]stes=ex.getStackTrace();
字符串堆栈;
//构建堆栈跟踪
stack=“stack:”+换行符;
对于(int i=0;i
将其输出到文件:

消息:无法创建应用程序com。(已修改应用程序名称以获得匿名)。*.*应用程序:java.lang.IllegalArgumentException
原因:java.lang.IllegalArgumentException
堆栈:
android.app.ActivityThread.handleBindApplication(ActivityThread.java:4254)
access$1400(ActivityThread.java:140)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1297)
android.os.Handler.dispatchMessage(Handler.java:99)
Looper.loop(Looper.java:137)
main(ActivityThread.java:4921)
java.lang.reflect.Method.Invokenactive(本机方法)
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(本机方法)

附言。
是的,我知道ACRA,但我现在不想使用它。

可能是您的应用程序导致了一个异常,该异常被捕获,然后重新启动

您只打印最后一个异常的堆栈跟踪。此异常可能有原因(
ex.getCause()
不是
null
)。在这种情况下,还应打印原因的堆栈跟踪(可能是原因的原因…)

你不必自己做这件事
Throwable
有一种很好的方法,可以将完整的堆栈跟踪和回溯打印到
PrintStream

public void printStackTrace(PrintStream s)

之后,您只需将
printStream
写入日志。

@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()
来获得完整的堆栈跟踪,这比我自己可以完成的要深得多。

Throwable.printStackTrace()
创造了奇迹。我潜得不够深。谢谢我也有同样的问题。如果你知道答案,请帮助我。@Saktimuthiah请看下面我的答案。我发布了基于公认答案的最终解决方案。