谷歌分析崩溃报告仅显示堆栈跟踪的第一行。

6

我的应用程序使用Google Analytics来追踪异常和崩溃(以及其他事情)。我使用此功能获取堆栈跟踪:

public static void sendErrorReportViaGoogleAnalytics(Exception e) {

    e.printStackTrace();
    Tracker myTracker = EasyTracker.getTracker();
    myTracker.sendException(getDescription(e), false);
}

public static String getDescription(Exception t) {

    final StringBuilder result = new StringBuilder();
    result.append(t.toString());
    result.append(',');
    String oneElement;

    for (StackTraceElement element : t.getStackTrace()) {
        oneElement = element.toString();
        result.append(oneElement);
        result.append(",");
    }

    return result.toString();
}

在处理异常时,我会在catch部分调用sendErrorReportViaGoogleAnalytics(),这样可以很好地工作。但是如果出现崩溃,我只能获取到一行堆栈跟踪信息,例如:

Binary XML file line #11: Error inflating class fragment

我设置了

<bool name="ga_reportUncaughtExceptions">true</bool>

在使用EasyTracker时,在analytics.xml中,我应该怎么做才能在发生崩溃时获取完整的堆栈跟踪信息呢?


我也想在分析中跟踪崩溃。据我所知,只能跟踪前200个字节。由于我使用标签管理器,无法使用@Raanan答案中的属性。你知道更多吗? - rekire
2个回答

4

我刚刚遇到了这个问题。只需将给定的代码粘贴到您的项目的BaseApplication.onCreate()方法或其他位置,以设置自定义ExceptionReporter来处理未捕获的异常。不要忘记在analytics.xml中声明给定的标志。

<bool name="ga_reportUncaughtExceptions">true</bool>

自定义未捕获异常报告器:

ExceptionReporter myHandler =
        new ExceptionReporter(EasyTracker.getInstance(this), GAServiceManager.getInstance(),
                              Thread.getDefaultUncaughtExceptionHandler(), this);

    StandardExceptionParser exceptionParser =
            new StandardExceptionParser(getApplicationContext(), null) {
                    @Override
                    public String getDescription(String threadName, Throwable t) {
                        return "{" + threadName + "} " + Log.getStackTraceString(t);
                    }
                };

    myHandler.setExceptionParser(exceptionParser);

    // Make myHandler the new default uncaught exception handler.
    Thread.setDefaultUncaughtExceptionHandler(myHandler);

1
这样做不会导致报告重复吗?你应该将布尔值设置为false以避免这种情况。 - Mark
在analytics.xml文件中仍然有这一行代码:<!-- 启用自动异常跟踪 --><bool name="ga_reportUncaughtExceptions">true</bool>,并且报告中没有重复项。 - sky
1
对我来说,使用“false”似乎也可以。你有没有可能尝试一下以确认一下? - Mark
它会正常工作,因为我们使用setDefaultUncaughtExceptionHandler方法为主(UI)线程设置未捕获异常处理程序的自定义实现。GA报告只是实现细节。 - sky
ga_reportUncaughtExceptions = true,报告重复!将其更改为false解决了此问题。 - Ali Noureddine
此解决方案将发送异常消息(通过Log.getStackTraceString),这违反了此处所述的使用建议:https://developers.google.com/analytics/devguides/collection/android/v4/exceptions#caught - jenglert

3

4
非常感谢您的回答。我正在使用<bool name="ga_reportUncaughtExceptions">true</bool>来追踪异常,但这只会记录堆栈跟踪的第一行。 - Analizer
@Raanan 你好,我也得到了堆栈跟踪的第一行。我根据你分享的谷歌开发者链接创建了exceptionparser。我看到还创建了getDescription(String threadName, Throwable t)方法。但是我无法继续前进。你能否给我发送一个示例代码呢?请发送到我的电子邮件mmaidul.islam@gmail.com。我在等待你的积极回复。 - Md Maidul Islam
@Maid786 GA已发布V3版本,我不确定是否仍然存在相同的错误/修复...应该尝试使用V3并遵循这里的说明:https://developers.google.com/analytics/devguides/collection/android/v3/exceptions此外,他们实现了一个StandardExceptionParser,可能更容易使用。 - Raanan
@Raanan谢谢您的回复。但我该如何在Onstop/OnDestroy方法中捕获此异常呢?我需要在onstop或on destroy方法中实现此功能。请回复.... - Md Maidul Islam
2
我不明白这个...为什么这是正确的答案?它没有回答任何问题。我仍然只能得到异常的第一行。 - Roel
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接