【问题标题】:Getting the StackTrace from original uncaughtException从原始 uncaughtException 获取 StackTrace
【发布时间】:2014-02-18 17:16:56
【问题描述】:

我正在尝试使 AndroidRuntime 异常 StackTrace 与 Logcat 相同。但是,当我重写 UncaughtExceptionHandler 的 uncaughtException 时,它给了我一个不同于 LogCat 的 StackTrace。这是我的代码:

private Thread.UncaughtExceptionHandler aovUncaughtExceptionHandler = 
    new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            StackTraceElement stackTrace[] = thread.getStackTrace();
            int stackTraceLength=stackTrace.length;
            String exceptionDescription = "";
            for (int i=0; i<stackTraceLength; i++) {
                exceptionDescription = exceptionDescription + stackTrace[i];
            }
            setException(exceptionDescription,true);
            applicationExceptionHandler.uncaughtException(thread,ex);
        }
    };

public AovGaTracker() {
    applicationExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
    Thread.setDefaultUncaughtExceptionHandler(aovUncaughtExceptionHandler);
}

这是使用 Exception 作为堆栈跟踪源时的堆栈跟踪:

android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
android.app.ActivityThread.access$800(ActivityThread.java:139)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
android.os.Handler.dispatchMessage(Handler.java:102)
android.os.Looper.loop(Looper.java:136)
android.app.ActivityThread.main(ActivityThread.java:5102)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:515)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
dalvik.system.NativeStart.main(Native Method)

这里是使用 Thread 作为 stackTace 源时的 stackTrace:

dalvik.system.VMStack.getThreadStackTrace(Native Method)
java.lang.Thread.getStackTrace(Thread.java:579)
com.example.googleanalytics.AovGaTracker$1.uncaughtException(AovGaTracker.java:28)
java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
dalvik.system.NativeStart.main(Native Method)

这里应该是来自 Logcat 的 StackTrace(这是我需要的):

FATAL EXCEPTION: main
Process: com.example.myfirstapp, PID: 18207
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myfirstapp/com.example.myfirstapp.MainActivity}:
java.lang.IllegalArgumentException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
at android.app.ActivityThread.access$800(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5102)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException
at com.example.myfirstapp.MainActivity.onCreate(MainActivity.java:21)
at android.app.Activity.performCreate(Activity.java:5248)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173)
... 11 more

在执行uncaughtException(Thread thread, Throwable ex) 之后,我是否可以执行获取stacktrace?我需要使用异步任务吗?我需要在同一个线程上编写 asynctask 吗?

【问题讨论】:

    标签: android multithreading exception-handling android-asynctask stack-trace


    【解决方案1】:

    根据运行时异常集的位置,始终只有一个未捕获的异常。

    log cat 中的异常是堆栈跟踪和异常原因的组合。你可以结合 exception.getStackTrace() 和 exception.getCause() 来得到和 logcat 一样的结果。

    【讨论】:

      【解决方案2】:

      在一个完美的世界里DefaultExceptionHandler 在整个申请过程中对我来说就像一个魅力。当它导致未处理的异常时,它会触发。

      名为 Android-Remote-StackTrace 的库。你只需要在你的Application类中注册这些DefaultHandlerException类的广播即可。

      片段:

       public class Portfolio extends Application {
       static Portfolio portfolio;
       public void onCreate() {
          super.onCreate();
          portfolio = this;
          ExceptionHandler.register(portfolio);// registering for unhandled Exceptions
         }
       }
      

      您可以使用这些来执行各种任务,例如将日志堆栈跟踪上传到您的服务器或将应用程序崩溃的邮件作为崩溃报告发送给您未处理的堆栈跟踪。

      【讨论】:

      • 我看到了获取 UncaughtException 的代码,它从 logcat 文件中获取堆栈跟踪。但是,无论如何在应用程序运行时捕获异常......比如说使用 AndroidRuntimeException()?
      猜你喜欢
      • 1970-01-01
      • 2018-05-15
      • 2012-05-18
      • 2015-03-23
      • 2010-11-13
      • 2018-05-25
      • 2018-10-13
      • 2018-02-09
      • 2019-08-22
      相关资源
      最近更新 更多