在Android上的Eclipse中debugging有什么问题?

可能重复:
Android看似无用的debugging环境

我显然被Visual Studio宠坏了,因为尽pipe我刚刚学习Android和Eclipse环境,但是在Eclipse中debugging应用程序正在成为进一步开发的严重不利因素。

例如,Eclipse会把这个除以零来编译:

public class Lesson2Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate (savedInstanceState); int i = 1 / 0; TextView tv = new TextView (this); tv.setText ("Hello, Android!"); setContentView (tv); } } 

然后,当它在debugging器下执行时,我将得到一个无用的debugging信息的全屏幕,其中的非实际指向我包含错误的特定行。

在exception('e')信息树中,stackTrace为null,它只是声明一个消息,指出'ArithmeticException'。 (这很好,你怎么把我指向你find它的方向呢?)

我已经看遍了整个屏幕,并且很困惑,这个IDE不能得到这个正确的。 使用Eclipse进行开发是否使用printf()将每个人都带回到1991年,就像在每个时间间隔进行日志logging,然后跟踪错误? 认真。

有没有一个configuration或插件,我错过了这个帮助?

我还没有用XCodetesting过这种情况,但是如果是iPhone dev的话。 IDE处理这个更像Visual Studio,那么难怪Android Market有这么几个应用程序。

我对Android很兴奋,但似乎Eclipse正在阻碍。

是的,您错过了一个非常重要的Eclipse插件“LogCat”。 它捕获Android程序给出的所有debugging日志,无论是在模拟器还是真实手机上运行。 后者显然要求将手机插入计算机,不太明显的是应用程序 – >开发 – >启用USBdebugging的设置被启用。

LogCat消息可以让您全面了解导致错误的原因,包括行号。 要在Eclipse中打开LogCat,请转到窗口 – >显示视图 – >其他 – > Android(列表中的文件夹之一) – > LogCat。 然后将LogCat窗口停靠在可以轻松查看的地方,Eclipse将记住该位置,并在下次启动时再次打开它。

(有时候LogCat和Emulator会互相断开连接,修复这个问题的简单方法就是closuresEclipse和模拟器,然后重新启动它们。)

(评论中有太多的话要说,所以我把这个写成了答案。)

您可以将Eclipseconfiguration为停止捕获,未捕获的exception或两者兼而有之。 默认情况下,Eclipse会中断任何未捕获的exception,并会忽略所有捕获到的exception(即任何被try / catch块阻塞的东西)。

Android的东西有点怪,因为你运行在一个应用程序框架中,而不是一个独立的应用程序。 正如你从上面发布的栈跟踪中可以看到的那样,ActivityThread实际上捕获了这个exception。 这意味着你的初始exception被认为是“被捕获”,并且不会触发Eclipse的未捕获处理,直到ActivityThread重新抛出。 出于这个原因,当你停下来的时候你在debugging器中看到的堆栈远不及你的代码。

既然你知道你正在得到一个ArithmeticException,你可以让它在这个exception的“被捕获”的实例上断开,并且它会在抛出点停止。 (不要让所有被捕的exception中断 – 你会无休止地打“简历”。)

就日志logging“迟到”而言,如果debugging器让程序继续执行,直到logging发生,那么您将无法在投掷点进行debugging。

我在logcat中获得以下堆栈跟踪:

 03-31 17:01:11.272: ERROR/AndroidRuntime(205): java.lang.RuntimeException: Unable to start activity ComponentInfo{MyClass}: java.lang.ArithmeticException: divide by zero 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.access$2100(ActivityThread.java:116) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.os.Handler.dispatchMessage(Handler.java:99) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.os.Looper.loop(Looper.java:123) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.main(ActivityThread.java:4203) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at java.lang.reflect.Method.invokeNative(Native Method) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at java.lang.reflect.Method.invoke(Method.java:521) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at dalvik.system.NativeStart.main(Native Method) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): Caused by: java.lang.ArithmeticException: divide by zero 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at MyClass.onCreate(MyClass.java:40) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364) 03-31 17:01:11.272: ERROR/AndroidRuntime(205): ... 11 more 

这很清楚。 查看堆栈跟踪的第14行中引起的exception,它说:除以零。 这是你做错了什么。 下一行说:在MyClass.onCreate(MyClass.java:40)这将是exception发生的行。我不明白什么是困难的,或无用的。 VS将如何呈现?

开始Android开发几个星期后,我对LogCat窗口中找不到的信息感到沮丧。 我会把日志消息放在我的应用程序中,从来没有看到他们,我知道我的应用程序正在抛出exception,但我从来没有见过这些。

终于有一天,我发现:我的LogCat窗口显示错误的设备。 我通常在任何时候都有两三台Android设备连接到我的电脑,而LogCat则显示其中一台设备。 要改变这个,你必须显示设备窗口并在窗口中select你想要的设备。

我觉得这是一个可笑的坏UI的例子。 在这里,我正在看一个LogCat窗口,在那个窗口中没有任何指示我正在看什么设备的日志。 我必须足够了解打开一个完全不同的窗口并在那里select设备。 在我明白这一点之前,我几乎浪费了几周的时间。 你会认为LogCat会默认所有的设备,或者至less自动切换到你最近启动应用程序的设备,但它不会。 如果你对你的桌子耸耸肩,想知道为什么LogCat是如此无用,也许这就是为什么。

您遇到的问题是使用物理设备进行开发,而不是使用机器上的软件进行开发。

它会指出你的具体错误(发布的信息,我们可以告诉你)只要find你的包名称的错误,它会显示exception被抛出。

您还应该使用断点逐步完成整个stream程,看看DDMSdebugging器应该满足您所需的所有要求。

是的,你应该使用日志Log.i(TAG,“Info:”+ x);

你无法预测所发生的一切,随着你的代码库的增长,你会很高兴你开始这么做。