Android上的Eclipse调试有什么问题?

Seb*_*nik 36 eclipse debugging android

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

我显然被Visual Studio宠坏了,因为虽然我只是在学习Android和Eclipse环境,但在Eclipse中调试应用程序正在成为进一步开发的严重损害.

例如,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,当它在调试器下执行时,我将获得一个无用的调试信息的全屏,其中没有实际指向包含错误的特定行.

stackTrace在异常('e')信息树中为空,它只是声明一条消息,指出'ArithmeticException'.(那很好,你怎么指向我找到它的方向!?)

我看了整个屏幕,我很困惑,这个IDE无法做到这一点.使用Eclipse进行开发是否会让所有人回到1991年,而printf()就像每个时间间隔记录一样,然后追踪错误?认真.

是否有我缺少的配置或插件来帮助解决这个问题?

我没有用XCode测试过这种情况,但是如果iPhone开发了.IDE处理这个更像Visual Studio,然后难怪Android市场有这么少的应用程序.

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

Ste*_*ley 25

是的,你错过了一个非常重要的Eclipse插件"LogCat".它可以捕获Android程序提供的所有调试日志,无论是在模拟器上运行还是在真实手机上运行.后者显然要求将手机插入计算机,不太明显,应用程序 - >开发 - >启用USB调试中的设置将被启用.

LogCat消息为您提供导致错误的完整细分,包括行号.要在Eclipse中打开LogCat,请转到Window - > Show View - > Other - > Android(列表中的一个文件夹) - > LogCat.然后将LogCat窗口停靠在您可以轻松查看的位置,Eclipse将记住该位置并在下次启动时再次打开它.

(有时LogCat和模拟器会相互脱离.解决这个问题的简单方法就是关闭Eclipse和模拟器,然后重新启动它们.)

  • 塞巴斯蒂安,不要试图用Eclipse.你在这里看到的问题是更少的Eclipse和更多的Android devenv.如果您使用Eclipse来调试普通的Java代码,通常会发现它至少*等于VS. 在许多情况下,我实际上更喜欢Eclipse.Android devenv无法为您提供Eclipse的完整调试功能. (4认同)
  • 感谢Jon,我只能希望Google的Android SDK团队能够看到这一点并努力改善Eclipse体验.到那时,更多胡思乱想的开发人员将会对这些细节进行研究.:) (4认同)
  • 如上所述你必须缺少日志猫,使用VS我发现在eclipse中编程和调试同样好 (3认同)
  • 一个系统并不是无用的,因为你无法正常操作它.如果你看下面的Janusz的答案,有一个例子,说明他的LogCat在运行你的代码时给出了什么,并且他非常清楚地指出,它显示了行号(他为14)和确切的错误类型(除以零).我收到了类似的报道.发生的情况是,在附加调试器时,在从Debug透视图中终止应用程序之前,异常日志不会发布到LogCat.发生这种情况是因为在调试器分离之前,应用程序实际上不会崩溃. (2认同)
  • [引用:在从Debug透视图中终止应用程序之前,异常日志不会发布到LogCat] ------是的,就是这样做的.现在我看到了同样的例外.*AFTER*我让程序运行完整的崩溃和退出过程.当它停止我的程序并显示IDE调试器屏幕时,它应该显示该信息.不要让我感到疑惑,浪费我的时间更多点击.Eclipse还有很长的路要走它似乎与Visual Studio之类的竞争.让我们希望我的耐心超越我的项目.感谢您的反馈.:) (2认同)

fad*_*den 11

(评论中有太多话要说,所以我写这个作为答案.)

您可以将Eclipse配置为停止捕获,未捕获或两者都有的异常.默认情况下,Eclipse将中断任何未捕获的异常,并将忽略所有捕获的异常(即任何被try/catch块阻塞的异常).

Android的事情有点奇怪,因为你在应用程序框架中运行,而不是独立的应用程序.从上面发布的堆栈跟踪中可以看出,ActivityThread实际上捕获了异常.这意味着您的初始异常被视为"已捕获",并且在ActivityThread重新抛出它之前不会触发Eclipse的未破解处理.因此,您在调试器停止时看到的堆栈远不及您的代码.

既然你知道你正在获得一个ArithmeticException,你可以让它在该异常的"捕获"实例上中断,并且它将在抛出点停止.(不要在所有被捕获的例外情况下打破它 - 你将无休止地打"恢复".)

对于"迟到"的日志记录,如果调试器让程序继续执行直到记录发生,那么您将无法在抛出点进行调试.


Jan*_*usz 10

我在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
Run Code Online (Sandbox Code Playgroud)

这很清楚.查看堆栈跟踪第14行中的导致异常,它说:除以零.这就是你做错了.下一行说:在MyClass.onCreate(MyClass.java:40)这将是异常发生的行.我不会得到什么困难,或无用的.VS如何呈现这个?

  • 欺骗我的是,在NULL deref的情况下,Eclipse'在'之前'呈现了一个回溯,你会在logcat中看到任何相应的消息.因此,在查看相关的logcat信息之前,您可能必须继续浏览Eclipse捕获的回溯/异常. (2认同)