Android 如何从开发人员控制台读取崩溃报告
我正试图根据一个用户提交的崩溃报告追踪bug的来源,并得出结论,我需要一些关于如何解释崩溃报告的基本培训 例如,碰撞报告如下所示: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
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,尽管我正在为每个版本上载一个映射文件。我仍然不清楚列表的显示顺序