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

10

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

例如,以下是一份崩溃报告:

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 中,但里面没有任何可能导致这样的异常...将一个 String 解析为 int 发生在那之前...解析后的 int 简单地传递给 cacheFileName

非常感谢您的帮助。

编辑

在下面的评论中引用更多代码片段:

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)抛出了异常。我不太确定缓存文件名后面列出的所有方法名称,也许Java专家可以发表评论。要查找的方法将是由onPostExecute调用的方法。为了调试,我会在MeteograomService.java中一般地查找对valueOf(String)的调用。希望没有太多。确保每个都尝试/捕获。 - Matthew Fisher
与您的小部件有关,当它在您的消息服务中进行更新时。 - Elltz
你是否正在使用ProGuard? - Zoe stands with Ukraine
是的,我正在使用Proguard,尽管每次发布时都会上传一个映射文件。 - drmrbrewer
4个回答

3

错误出现在MeteogramService.java文件中。

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

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


3
您需要从上到下和从下到上都要读一遍。
通常情况下,它从顶部具体到底部更加广泛。
从顶部:你会找到异常的确切原因。
在这种情况下,是java.lang.NumberFormatException,它在cacheFileName的cacheBaseName处引发了问题。
从底部:您将找到问题的一般区域。
GetServerWidgetAsyncTask.onPostExecute 我觉得这看起来可能是在AsyncTask中后台工作完成时某个值格式不正确并在onPostExecute中被用作int。
我会开始调试pxWidth、pxHeight和appWidgetId的值,以便理解String fileName = cacheBaseName(appWidgetId) + "_" + pxWidth + "x" + pxHeight + ".png"; 的含义。
Integer.valueOf意味着它可能尝试将字符串解析为int,例如:字符串“13”转换为int 13。
在这3个变量中,最有可能存在关系的是appWidgetId,因为还有另一个提示是getAppWidgetId。但是为了确定,请记录所有3个!=)

2

这个是显示引起NumberFormatException异常的调用顺序吗?

是的,这个堆栈跟踪确实显示了导致异常的方法调用顺序。从底部到顶部阅读堆栈跟踪以了解方法调用的顺序 -

MeteogramService内嵌的access method是什么?...在那个类中没有访问方法

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

如何确定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()中,这些调用在列表中更靠后。所以,再次问一下,正确的阅读顺序是什么? - drmrbrewer
@Polarbear0106 哪些方法? - Ankit Aggarwal
cacheFileName 和 cacheBaseName - Zoe stands with Ukraine

0

我同意其他人的看法,

通常在崩溃报告中,您需要查找异常,例如NumberFormatException,以及您的类包名称。

假设您的包是com.cloud3squared.meteogram.,问题来自于您的Meteogram服务,并且您错误地使用了Integer.parseInt()

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


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