Android 如何从开发人员控制台读取崩溃报告

Android 如何从开发人员控制台读取崩溃报告,android,debugging,crash-reports,developer-console,Android,Debugging,Crash Reports,Developer Console,我正试图根据一个用户提交的崩溃报告追踪bug的来源,并得出结论,我需要一些关于如何解释崩溃报告的基本培训 例如,碰撞报告如下所示: 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.pars

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

例如,碰撞报告如下所示:

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
的调用顺序,如果是,顺序是什么?我是否从下到上阅读
处的
行?什么是
access
嵌套在
metegramservice
中?。。。该类中没有
access
方法。如何确定在哪个函数中实际发生
NumberFormatException
?从逻辑上讲,我会说是在
cacheFileName
内部,但里面没有任何东西可能导致这样的异常。。。将
字符串
解析为
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;
}

错误在
metegramservice.java
文件中

错误
NumberFormatException
是由于无效的int值引起的,这可能是因为将字符串或无效变量传递到int中

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

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

是的,此堆栈跟踪明确显示了导致异常的调用顺序。从下到上读取堆栈跟踪,以了解方法调用的顺序-

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

这些访问方法是自动生成的方法,用于从内部类访问外部类的成员。更多详情请查看杰克·沃顿的文章

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

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

没有任何东西会导致这样的例外

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


因此,结论是您正在对无效整数的空字符串调用valueOf()方法,因此必须从上到下和从下到上读取
NumberFormatException

通常从顶部到底部更具体

从顶部开始:您将找到异常的确切原因

在本例中,它是
java.lang.NumberFormatException
,在
cacheFileName
cacheBaseName

从底部开始:您将找到问题的大致区域

GetServerWidgetAsyncTask.onPostExecute

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

我首先要调试
String fileName=cacheBaseName(appWidgetId)+“”+pxWidth+“x”+pxHeight+.png”中的值:
pxWidth
pxHeight
,和
appWidgetId

Integer.valueOf
表示它可能试图将字符串解析为int,例如:将字符串“13”解析为int 13


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

我同意其他人的看法

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

假设您的包是
com.cloud3squared.metegram.
,那么问题出在您的metegram服务上,您使用的
Integer.parseInt()
是错误的


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

是的,异常堆栈显示调用顺序。最上面的一个(InvalidIt)抛出了异常。我不太确定cacheFileName后面列出的所有方法名称,也许Java专家可以发表评论。要向前看的方法将是onPostExecute调用的方法。为了进行调试,我通常会在MeteograomService.java中查找对valueOf(String)的调用。希望不会太多。请确保尝试/捕获每一次点击都与您的小部件有关,当它在您的messagegram服务中更新时,您使用的是ProGuard吗?是的,我使用的是ProGuard,尽管我正在为每个版本上载一个映射文件。我仍然不清楚列表的显示顺序