如何强制android应用程序打印未捕获异常的堆栈跟踪?

时间:2015-07-10 07:48:09

标签: android exception-handling

当我的应用程序崩溃时,它会在Logcat中抛出一些行:

07-10 10:35:34.671  32391-32391/com.noframe.farmisagronom D/AndroidRuntime﹕ Shutting down VM
07-10 10:35:34.671  32391-32391/com.noframe.farmisagronom W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x415bf8b0)

如何强制app打印异常的堆栈跟踪?

我的应用程序类代码:

public class Application extends MultiDexApplication {

    @Override
    protected void attachBaseContext(Context base) {
        try {
            super.attachBaseContext(base);
            MultiDex.install(this);
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    @Override
    public void onCreate() {

        try {
            Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

                @Override
                public void uncaughtException(Thread t, Throwable e) {
                    Log.e("Uncaught Exception detected in thread {}", t.getName(), e);
                }
            });
        } catch (SecurityException e) {
            Log.e("Could not set the Default Uncaught Exception Handler", "" ,e);
        }
        super.onCreate();
    }
}

请注意setDefaultUncaughtExceptionHandler是我尝试获取堆栈跟踪表单异常,但它不起作用。

当我在每个地方尝试使用try-catch时,我会抓住这些例外情况。但这并不总是一种选择,需要大量的时间。

2 个答案:

答案 0 :(得分:0)

您可以使用(String tag,String msg,Throwable tr)签名查看所有日志方法Here's the link的覆盖。

将异常作为第三个参数传递应该会在logcat中提供完整的堆栈跟踪。

三参数日志方法使用 getStackTraceString()方法

答案 1 :(得分:0)

我是这样做的:

StackTraceElement[] st = new StackTraceElement[12];
st = ex.getStackTrace();
for (StackTraceElement el: st)
    com.example.android.common.logger.Log.e(TAG, " " + el);

希望它会有所帮助。