如何从开发者控制台

时间:2016-08-25 07:11:43

标签: android debugging crash-reports developer-console

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

例如,崩溃报告如下:

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简单地传递到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;
}

4 个答案:

答案 0 :(得分:3)

错误发生在public partial class Foo : UserControl { public static readonly DependencyProperty AnchorPointProperty = DependencyProperty.Register( "AnchorPoint", typeof(Point), typeof(Foo), new FrameworkPropertyMetadata(new Point(0, 0), FrameworkPropertyMetadataOptions.AffectsMeasure)); public Point AnchorPoint { get { return (Point)GetValue(AnchorPointProperty); } set { SetValue(AnchorPointProperty, value); } } private Canvas mCanvas; public Foo(Canvas canvas, bool isInput) { InitializeComponent(); mCanvas = canvas; this.LayoutUpdated += Node_LayoutUpdated; } void Node_LayoutUpdated(object sender, EventArgs e) { Size size = RenderSize; Point ofs = new Point(size.Width / 2, size.Height / 2); AnchorPoint = TransformToVisual(this.mCanvas).Transform(ofs); } } 文件中。

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

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

答案 1 :(得分:3)

您必须从从上到下从下到上一起阅读。

通常从顶部到底部更广泛。

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

在这种情况下,java.lang.NumberFormatExceptioncacheFileName cacheBaseName GetServerWidgetAsyncTask.onPostExecute爆发pxWidth

从BOTTOM :您会找到问题的一般区域

pxHeight

这对我来说是这样的,它可能是在AsyncTask的后台工作中完成的一些值,格式不正确并在onPostExecute中用作int。

我开始的地方是调试appWidgetId中的String fileName = cacheBaseName(appWidgetId) + "_" + pxWidth + "x" + pxHeight + ".png";Integer.valueOfappWidgetId的值

getAppWidgetId表示它可能正在尝试将字符串解析为int,例如:字符串“13”进入int 13。

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

答案 2 :(得分:2)

  

这是否显示导致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

答案 3 :(得分:0)

我同意其他人的意见,

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

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

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