如何从开发者控制台读取崩溃报告
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
内部说,但那里没有任何东西可能导致这样的异常...... String
到 int
的解析发生在此之前......解析的 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.NumberFormatException
在cacheFileName
的cacheBaseName
处爆炸
从底部:你会发现问题的一般范围
GetServerWidgetAsyncTask.onPostExecute
在我看来,这可能是在 AsyncTask 的后台工作中完成的某个值的格式不正确并在 onPostExecute 中用作 int。
我首先要调试String fileName = cacheBaseName(appWidgetId) + "_" + pxWidth + "x" + pxHeight + ".png";
中的pxWidth
、pxHeight
和appWidgetId
的值
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