如何从开发者控制台读取崩溃报告

Posted

技术标签:

【中文标题】如何从开发者控制台读取崩溃报告【英文标题】:How to read crash reports from Developer Console 【发布时间】:2017-01-01 12:10:40 【问题描述】:

我正在尝试根据用户提交的崩溃报告追踪错误的来源,并得出结论,我需要一些关于如何解释崩溃报告的基本培训。

例如,崩溃报告如下:

java.lang.NumberFormatException: Invalid int: ""
    at java.lang.Integer.invalidInt(Integer.java:138)
    at java.lang.Integer.parseInt(Integer.java:358)
    at java.lang.Integer.parseInt(Integer.java:334)
    at java.lang.Integer.valueOf(Integer.java:525)
    at com.cloud3squared.meteogram.MeteogramService.cacheFileName(MeteogramService.java)
                                                    cacheBaseName(MeteogramService.java)
                                                    getAppWidgetId(MeteogramService.java)
                                                    createAdhocWidgetUpdateIntent(MeteogramService.java)
                                                    setupBasicClickStuff(MeteogramService.java)
                                                    setAdhocAppWidgetAlarm(MeteogramService.java)
                                                    setNextClockWidgetUpdateAlarm(MeteogramService.java)
                                                    cancelAppWidgetAlarm(MeteogramService.java)
                                                    cancelAppWidgetAlarms(MeteogramService.java)
                                                    logAction$3aaf2084(MeteogramService.java)
                                                    logActionAgainstAllWidgets$62dc3a79(MeteogramService.java)
                                                    updateAppWidget(MeteogramService.java)
                                                    showButtons(MeteogramService.java)
                                                    hideButtons(MeteogramService.java)
                                                    fetchOk(MeteogramService.java)
                                                    getViewId(MeteogramService.java)
                                                    putBitmapIntoWidget(MeteogramService.java)
                                                    lngNow(MeteogramService.java)
                                                    showNotification(MeteogramService.java)
                                                    showMessageInWidget(MeteogramService.java)
                                                    sharpen(MeteogramService.java)
                                                    removeFromRequestsList(MeteogramService.java)
                                                    removeFromRequestsList$204347ff(MeteogramService.java)
                                                                           MeteogramService.java)
                                                    displayStuffInWidget(MeteogramService.java)
                                                    access$000(MeteogramService.java)
                                                    access$100(MeteogramService.java)
                                                    access$300(MeteogramService.java)
    at com.cloud3squared.meteogram.MeteogramService$GetServerWidgetAsyncTask.onPostExecute(MeteogramService.java)
    at android.os.AsyncTask.finish(AsyncTask.java:651)
    at android.os.AsyncTask.access$500(AsyncTask.java:180)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:224)
    at android.app.ActivityThread.main(ActivityThread.java:5526)
    at java.lang.reflect.Method.invoke(Method.java)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

这是否显示了导致NumberFormatException 的调用顺序,如果是,按什么顺序?我是否从下到上阅读at 行? access 嵌套在 MeteogramService 中是什么?...该类中没有 access 方法。如何确定 NumberFormatException 实际出现在哪个函数中?从逻辑上讲,我会在 cacheFileName 内部说,但那里没有任何东西可能导致这样的异常...... Stringint 的解析发生在此之前......解析的 int 只是传递给 @ 987654331@.

感谢您的帮助。

编辑

更多代码 sn-ps 可以在下面的 cmets 中引用:

static String cacheFileName(Context context, int appWidgetId, int pxWidth, int pxHeight) 
    String fileName = cacheBaseName(appWidgetId) + "_" + pxWidth + "x" + pxHeight + ".png";
    logAction(context, appWidgetId, "cacheFileName " + fileName, TAG);
    return fileName;


static String cacheBaseName(int appWidgetId) 
    return (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) ? "widget_" : "widget_" + appWidgetId;

【问题讨论】:

是的,异常堆栈显示调用顺序。最上面的一个(invalidInt)抛出了异常。我不太确定 cacheFileName 后面列出的所有方法名称,也许 Java 专家可以发表评论。期待的方法将是 onPostExecute 调用的方法。为了调试,我通常会在 MeteograomService.java 中查看对 valueOf(String) 的调用。希望没有太多。确保尝试/抓住每个 它与您的小部件有关,当它在您的消息报服务中更新时 你在使用 ProGuard 吗? 是的,我正在使用 proguard,但为每个版本上传一个映射文件。 【参考方案1】:

你必须从从上到下从下到上阅读。

通常从顶部到底部更具体。

从TOP:你会找到异常的确切原因

在这种情况下,java.lang.NumberFormatExceptioncacheFileNamecacheBaseName 处爆炸

从底部:你会发现问题的一般范围

GetServerWidgetAsyncTask.onPostExecute

在我看来,这可能是在 AsyncTask 的后台工作中完成的某个值的格式不正确并在 onPostExecute 中用作 int。

我首先要调试String fileName = cacheBaseName(appWidgetId) + "_" + pxWidth + "x" + pxHeight + ".png"; 中的pxWidthpxHeightappWidgetId 的值

Integer.valueOf 表示它可能试图将字符串解析为 int,例如:String "13" into int 13。

在这 3 个变量中,最可能的关系是 appWidgetId,因为还有一个关于 getAppWidgetId 的提示。但可以肯定的是,记录所有 3 个! =)

【讨论】:

【参考方案2】:

错误在MeteogramService.java 文件中。

错误NumberFormatException是由于int值无效,这可能是因为将字符串或无效变量传递给int。

类名或方法名的列表是从上到下访问变量的顺序。验证您是否传递了一个 int,如果它是用户定义的值,则使用 try/catch 块并在输入非 int 值时显示 toast。

【讨论】:

【参考方案3】:

这是否显示导致 NumberFormatException 的调用顺序

是的,这个堆栈跟踪肯定会向您显示导致异常的调用顺序。从下到上阅读堆栈跟踪以了解方法调用的顺序 -

什么是嵌套在 MeteogramService 中的访问?...该类中没有访问方法

这些访问方法是自动生成的方法,用于从内部类访问外部类的成员。有关更多详细信息,请查看 Jake Wharton 的 video。

如何确定 NumberFormatException 实际发生在哪个函数中

检查堆栈跟踪中的所有方法调用。最上面的会告诉您首先从哪个方法抛出异常。因此,如果您检查堆栈跟踪,则第 2 到第 4 行中的方法调用来自 Integer.java 类,该类不是您定义的类,但异常是从该类启动的。现在如果你来到第 5 行,它清楚地告诉你下一个方法调用是MeteogramService.cacheFileName()。因此,当您尝试使用此方法执行某些操作时,就会出现异常。

里面没有任何东西会导致这样的异常

仔细阅读您的堆栈跟踪。在第一行它说java.lang.NumberFormatException: Invalid int: ""。这意味着您将空字符串或“”传递给整数类。现在,如果您检查MeteogramService.cacheFileName() 之前的行,它会显示java.lang.Integer.valueOf() 方法已被您调用。

因此结论是您正在调用 valueOf() 方法并且空字符串不是有效的整数,因此是 NumberFormatException

【讨论】:

我仍然对阅读列表的顺序感到困惑。如果是自下而上,则异常必须发生在cacheFileName() 中。但是我已将该函数的代码添加到我的问题中,并且该函数中没有对 Integer.valueOf()... 的引用,甚至在该函数调用的 cacheBaseName() 中也没有。对Integer.valueOf() 的唯一调用是在showNotification()removeFromRequestsList() 中,它们位于列表的下方。那么,再次阅读排序的正确方法是什么? @Polarbear0106 有哪些方法? cacheFileName 和 cacheBaseName【参考方案4】:

我同意其他人的观点,

通常对于崩溃报告,您要查找异常,在本例中为 NumberFormatException,然后查找您的类包名称。

假设您的包裹是 com.cloud3squared.meteogram.,问题出在您的 Meteogram 服务上,而您使用的 Integer.parseInt() 错误。

请注意,对于Integer.parseInt(),您需要一个包含数字的字符串,例如“3”或“5”。如果它没有这个,该方法将因NumberFormatException 而崩溃。我在您的 cacheFileName() 类中没有看到该方法调用,因此我建议您通过堆栈跟踪搜索 getAppWidgetID() 和其他方法调用。

【讨论】:

以上是关于如何从开发者控制台读取崩溃报告的主要内容,如果未能解决你的问题,请参考以下文章

如何向开发者发送崩溃报告?

应用程序在调试时运行时如何禁用 Firebase 崩溃报告?

在Android Developer Console上崩溃和ANR

Android:如何在Google Play开发者控制台中获取有关已捕获例外的信息?

Google Play 控制台开发者监控错误

让Android Studio调试版崩溃的Google Play Developer Console?